- - PR -
ArrayList<Map<String, String>>のソート
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-11-13 23:33
ArrayList<Map<String, String>> al = new ArrayList<Map<String, String>>();
for(int i=0;i<10;i++){ <Map<String, String>> map = new <Map<String, String>>(); map.put("ソート優先1",Integer.toString((int)(Math.random() * 10 + 1))); map.put("ソート優先2",Integer.toString(i)); al.add(map); } 上記の状態でalをmapのソート優先1、ソート優先2の項目をそれぞれ昇順でソートしたいです。 この場合、一度にソートすることは可能でしょうか? 先にソート優先2の項目でソートし、ソートしたalに対し さらにソート優先1の項目でソートするという方法になるでしょうか? [ メッセージ編集済み 編集者: Orphan 編集日時 2007-11-14 00:16 ] | ||||
|
投稿日時: 2007-11-14 00:31
Java1.4までの知識しかないので これがコンパイルできるかどうか解りませんし またループ中でalにaddしたとして 一度にソート可能かどうかといえば可能じゃないですか? Comparator#compareの実装次第 # Collectionsって結構かわったんでしたっけ? | ||||
|
投稿日時: 2007-11-14 00:54
こんな感じのComparatorを書けばよいです。 key1同士で比較して0ならば同値なので、key2の比較結果を返せば、 同一のkey1内でkey2のソートが行われます。 key1が違えばそもそもkey1でソートされます。 | ||||
|
投稿日時: 2007-11-14 08:28
かつのりさんの書き込みも見てちょっとした疑問
1.MapやComparatorはInterfaceではなくなった 2.Interfaceもインスタンス化できるようになった 3.実現化するのは当然の前提 どれなんでしょ? | ||||
|
投稿日時: 2007-11-14 09:03
無名クラス、または匿名クラスをキーワードに検索すれば幸せになれるでしょう | ||||
|
投稿日時: 2007-11-14 11:02
なるほどInterfaceも匿名クラスで定義できたんですね。
それにしてもJava5で結構かわってますね。 Comparator#compare(Object, Object)も自分で実装する必要もないみたいですし abstractにもなっている(こちらの意義はまだ理解できてません) 勉強時間をとって追いつかなくては・・ [ メッセージ編集済み 編集者: kuma 編集日時 2007-11-14 11:07 ] | ||||
|
投稿日時: 2007-11-14 11:31
重箱の隅つつきになってしまいますが、言い回しが気になります。
interfaceが匿名クラスで定義できるように読み取れてしまいます。 匿名クラスという構文(機構)を用いることで、Interfaceを実装したクラスが定義できます。 #これでもまだ言い回しは正しくないかもしれない 出来上がるのはinterfaceではなく、具象クラスです。 | ||||
|
投稿日時: 2007-11-14 11:58
個人的にはMapを汎用データ型として使っていることの方が気になりますね。
ソートのキーとなる2つの項目があるのでしょうが、 これらをフィールドとして持つクラスを新たに定義してやるほうがよいでしょう。 MapのValueの部分でIntegerをStringに変えるような変換していますが、 そもそもint型のフィールドとして持つことができる。 多様なソート順を必要とするならComparatorを用いることになるでしょうが、 Comparatorの型パラメータもクラス名で定義できるのですっきりしますし、 ソート順が単一ならComparableをクラスに実装してしまえばいい。 |