• ベストアンサー

2次元の配列となっているクラス(HashMap)から指定の要素を検索する方法

HashMap[] seminar_list; seminar_list = dbControl.get_SEMINAR_LIST(); という形で以下のような表形式のデータをseminar_listにセットしました。 ------------------ ID CATEGORY 001 aaa 002 bbb 003 bbb ------------------ 1次元の配列であれば、配列の位置を検索できることを確認できましたが、2次元の場合はどのように検索を行えばよいのでしょうか? 行いたいことは、ID:001のCATEGORYの値 を取得するようなプログラムを作成したいと思っています。 以下のようなプログラムを作成しましたが、(1)のところでエラー (java.lang.ClassCastException)となってしまいました。 =========================================================================== Arrays.sort(seminar_list); (1) int seminar001_index = Arrays.binarySearch(seminar_list, "001"); (2) String cate001 = (String)seminar_list2[cate001_index].get("CATEGORY"); (3) =========================================================================== よろしくお願いいたします。

  • Java
  • 回答数3
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • Noriwo003
  • ベストアンサー率61% (8/13)
回答No.2

2次元配列というのは int[][] num = new int[3][4]; こういう風に配列の中に配列があるものです。 それは置いといて。 IDとCategoryがHashMap[]にどういう風に入ってるか気になりますね seminar_list[0].put("001","aaa"); seminar_list[1].put("002","aaa"); もしかしてこんな感じですか? これなら配列にする必要はないですね。 seminar_list.put("001","aaa"); seminar_list.put("002","bbb"); でOK 他の質問でもありましたが、なぜHashMapを配列に・・・。 あと、蛇足ですが public IDComparator implements Comparator{ public int compareTo(HashMap map1,HashMap map2){ String str1 = null; String str2 = null; for(int i=0;i<3;i++){ String id = "00" + (i+1); str1 = map1.get(id); if(str1 != null) break; } //上記と同じことをmap2でも実行 int num1,num2; if(str1.equals("aaa")) num1 = 1; //上記と同様に"bbb"のときnum1 = 2;のようにし、     //num2でも繰り返す。 return num1 - num2; } } というクラスを作って 質問の(1)の上の行に Comarator c = new IDComparator(); ほいで(1)を Arrays.sort(seminar_list,c); とすると "sortは" うまくいきます。が、残念ながら次の行で死にます hiroaki213さんが指摘されたようにすると次の行もうまくいきます。 何でうまくいかないのかわからないなら、今はほっとくというのも手です。僕は実際Comparatorを使うまではさっぱりわかりませんでした。 ここら辺の面倒臭さがJavaのとっつきにくい理由なんですよね。 経験の浅い人でもキッチリしたプログラムを作れるという利点でもあるのですが。

その他の回答 (2)

  • Noriwo003
  • ベストアンサー率61% (8/13)
回答No.3

よく読んでなかった! (2)と(3)に書いてあるやんorz この場合はArrayListを使うといいですよ。 ArrayList idList = //IDの値を入れる ArrayList categoryList = //Categoryの値を入れる HashMap map = new HashMap(); map.put("IDList",idList); map.put("CategoryList",categoryList); という感じで。 ArrayListは入れた順番を記憶してくれるので配列のように位置を指定できます。 ArrayListやHashMapの使い分けができると、プログラムの幅がぐっと広がりますよ。

回答No.1

例外java.lang.ClassCastExceptionは 配列に相互に比較可能でない要素が混ざっているときに 投げられる例外だそうです。 例えば seminar_list[0]とseminar_list[1]はどのように比較すると思いますか? 参照型の配列をArrays.sort()メソッドの引数として渡す場合は きちんと比較方法を定義しなければなりません。 APIによると、配列の要素は全てComparableインタフェースを実装しており また、配列のすべての要素は、「相互に比較可能」でなければないそうです。 つまり、配列の要素が e1 および e2 の場合に、e1.compareTo(e2) で ClassCastException を投げないようにしなければなりません。 具体的な方法としましては HashMapクラスを継承し、Comparableインタフェースを実装した 新たなクラスを定義し、比較方法(CompareTo()メソッド)を 定義してあげてはいかがでしょうか? あとこれは余談ですが 本当に配列を用いなければなりませんか? 読みやすいプログラムを書くことも大切です。

参考URL:
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util/Arrays.html#sort(java.lang.Object[])

関連するQ&A

  • String配列とHashMap

    メソッドの引数の数がとても多いので、String配列かHashMapにまとめて、値を渡すことになりました。 どちらを使うかなのですが、私の記憶だとString配列とHashMapの違いを次のように認識してるのですが、調べても答えが見つかりません。合ってるか教えてください。 String配列は、インデックスを検索しつつ値を取得してるので、インデックスの大きい番号ほど、値取得時の処理に時間を使う。HashMapは、特別な検索方法(?)で検索してるので、値取得時の処理に、時間をかけずにすむ。 なので、メソッドの引数として使うのはHashMapの方がよい。 メソッドの引数という性格上、要素数を固定しなくてもいいHashMapの方が使いやすいと思ってるのですが、現場のリーダーさんの認識とずれちゃってます。説得したいので、この辺りのことが解説されているサイトがありましたら、合わせて教えていただけると嬉しいです。

    • ベストアンサー
    • Java
  • HashMap要素の操作について

    過去質問を検索致しましたが、適当な質問を見つけられなかった為、質問をさせて頂きます。 ●下記コードのうち、AブロックとBブロックとでどのように異なる為、 Aブロックの値操作が、そのままHashMapへ反省されてしまうのかをご教示願えませんでしょうか? コメント"Aブロック"部分でのArrayList型変数へ操作した内容は、そのままHashMap内の当該キー要素に反映されてしまいます。 コメント"Bブロック"で行う、String型への操作は、HashMap内の当該キー要素に反映はされません。 ■実行環境 ・jdk1.3.1_11 ・Windows XP pro SP2 _________________________________________________ HashMap testMap = new HashMap(); // マップへArrayListとStringを追加 testMap.put("KEY_LIST", new ArrayList()); testMap.put("KEY_STRING", "stringVal"); // Aブロック ArrayList testList = (ArrayList) testMap.get("KEY_LIST"); testList.add("one"); testList.add("two"); testList.remove(0); // Bブロック String testString = (String) testMap.get("KEY_STRING"); testString = "one"; testString = ""; _________________________________________________

    • ベストアンサー
    • Java
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • Java:要素にnullが入った多次元配列の次元数

    次のプログラムを見かけて質問します。 String[][] Array = { {"Sunday", "Monday"}, null, {"Monday", "Tuesday"} }; イコールの左を見ると二次元配列に見えますが、右を見ると三次元配列に見えます。 nullは要素として数えられないのでしょうか。 その場合、それは何故なのか教えてもらえますか? よろしくお願いします。

    • ベストアンサー
    • Java
  • java HashMapで数値データを取り出すには

    HashMapの使い方について教えてください。 DBのテーブルから、「SEMINAR_TITLE」「SEMINAR_PRESENTER_NAME」「SEMINAR_NUM」の 値を取得して、HashMapにセットしようと考えてます。 「SEMINAR_NUM」だけ、数値型となっており、他の2つは文字列となっています。 ------------------------------------------------------------------------------------------- HashMap seminar_list = new HashMap(); //DBから値を取得して、seminar_listにセットする。 seminar_list = dbControl.get_SEMINAR_LIST("001"); String seminar_title = (String)seminar_list.get("SEMINAR_TITLE"); String seminar_presenter_name = (String)seminar_list.get("SEMINAR_PRESENTER_NAME"); int seminar_num = (int)seminar_list.get("SEMINAR_NUM"); ------------------------------------------------------------------------------------------- のような式を書いてみましたが、 int seminar_num = (int)seminar_list.get("SEMINAR_NUM"); のところでエラーとなってしまいます。 (他の2つの値は取得する事ができています) 数値データを取り出すにはどのようにすればよいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 要素にnullが入った多次元配列の次元数(2回目)

    同様の質問について再度投稿します。 以下、問題集で見掛けたプログラムの抜粋です。 String[][] Array = { {"Sunday", "Monday"}, null, {"Monday", "Tuesday"} }; int count =0; for (String[] A : array){ count += A.length; } System.out.println(count); このプログラムを実行すると、 要素nullのlengthが数えられないため、 NullPointerExceptionが発生する、ということです。 以前に質問した際には、 上記配列に含まれるnullは、大カッコで囲まれていないため、 次元としてカウントされないので、配列の次元数は 2次元となる、という回答を頂きました。 (配列変数も二次元で宣言されている。) 細かいようですが、大カッコで囲まれていないnullは 次元数としてカウントされなくても、要素として 拡張for文の対象にはなるのでしょうか…? 解説をお願いします。

  • VB.NET の配列の要素数

    VB.NETで List(Of String()) の多次元配列を宣言したとします。 Listの要素数とListの中のStringの要素数はどのように確認すれば わかるでしょうか? どうぞ、よろしくお願いいたします。

  • 多次元配列を2次元の連想配列で表したい

    PHP初心者です。 $category = array( array( 'ライフ' ), array( 'デジタルライフ', array( '携帯・PHS' ), array( 'ワンセグ放送' ) ), array( '趣味', array( 'AV機器', array( 'オーディオ' ), ), ), ); このような多次元配列を $new_category = array( array( 'id'=> '1', 'parent_id' => '-', 'name' => 'ライフ', ), array( 'id'=> '2', 'parent_id' =>'-', 'name' => 'デジタルライフ', ), array( 'id'=> '3', 'parent_id' => '2', 'name' => '携帯・PHS', ), array( 'id'=> 4, 'parent_id' => '2', 'name' => 'ワンセグ放送', ), array( 'id'=> 5, 'parent_id' => '-', 'name' => '趣味', ), array( 'id'=> '6', 'parent_id' => '5', 'name' => 'AV機器', ), ); このような二次元配列に変換したいです。 parent_idを入れておく配列を作って、階層が深くなったら前の要素のIDを配列に入れ、浅くなったら配列の末尾の要素を消去する…みたいなことを考えてあれこれやってみたのですが、なかなかうまくいきません。 何か良い方法がありましたら、教えていただけるとありたがいです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 2次元配列のマスを数える方法を教えてください!!

    C++において、2次元配列の要素で上下左右に連続して塗り潰されている集まりをカウントする方法を教えてください!! 10*10の2次元配列を用意して、上下左右に連続して塗り潰されている集まりを関数の再帰処理を用いてカウントするプログラムを作りたいのですがわかりません。 問題例 ◇◆◇◇◇◆◇◆ ◆◆◇◆◇◇◇◆ ◇◇◇◆◆◆◇◆ この場合集まりは4です! 配列はstring型で多バイトの文字をカウントします。 回答お願いします!!

  • 2次元配列のマスを数える方法を教えてください!!

    C++において、2次元配列の要素で上下左右に連続して塗り潰されている集まりをカウントする方法を教えてください!! 10*10の2次元配列を用意して、上下左右に連続して塗り潰されている集まりを関数の再帰処理を用いてカウントするプログラムを作りたいのですがわかりません。 問題例 ◇◆◇◇◇◆◇◆ ◆◆◇◆◇◇◇◆ ◇◇◇◆◆◆◇◆ この場合集まりは4です! 配列はstring型で多バイトの文字をカウントします。 回答お願いします!!

専門家に質問してみよう