• ベストアンサー

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) =========================================================================== よろしくお願いいたします。

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

  • ベストアンサー
  • 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