- PR -

ArrayList<Map<String, String>>のソート

投稿者投稿内容
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 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 ]
kuma
大ベテラン
会議室デビュー日: 2004/02/25
投稿数: 110
投稿日時: 2007-11-14 00:31
引用:

Orphanさんの書き込み (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));
}
[ メッセージ編集済み 編集者: Orphan 編集日時 2007-11-13 23:55 ]

[ メッセージ編集済み 編集者: Orphan 編集日時 2007-11-13 23:55 ]


Java1.4までの知識しかないので
これがコンパイルできるかどうか解りませんし
またループ中でalにaddしたとして
一度にソート可能かどうかといえば可能じゃないですか?
Comparator#compareの実装次第

# Collectionsって結構かわったんでしたっけ?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-14 00:54
引用:

Collections.sort(al, new Comparator<Map<String, String>>() {
public int compare(Map<String, String> o1, Map<String, String> o2) {
int result = o1.get("key1").compareTo(o2.get("key1"));
if (result == 0) {
return o1.get("key2").compareTo(o2.get("key2"));
}

return result;
}
});


こんな感じのComparatorを書けばよいです。
key1同士で比較して0ならば同値なので、key2の比較結果を返せば、
同一のkey1内でkey2のソートが行われます。
key1が違えばそもそもkey1でソートされます。
kuma
大ベテラン
会議室デビュー日: 2004/02/25
投稿数: 110
投稿日時: 2007-11-14 08:28
かつのりさんの書き込みも見てちょっとした疑問

1.MapやComparatorはInterfaceではなくなった
2.Interfaceもインスタンス化できるようになった
3.実現化するのは当然の前提

どれなんでしょ?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-14 09:03
引用:

kumaさんの書き込み (2007-11-14 08:28) より:
かつのりさんの書き込みも見てちょっとした疑問

1.MapやComparatorはInterfaceではなくなった
2.Interfaceもインスタンス化できるようになった
3.実現化するのは当然の前提

どれなんでしょ?


無名クラス、または匿名クラスをキーワードに検索すれば幸せになれるでしょう
kuma
大ベテラン
会議室デビュー日: 2004/02/25
投稿数: 110
投稿日時: 2007-11-14 11:02
なるほどInterfaceも匿名クラスで定義できたんですね。

それにしてもJava5で結構かわってますね。
Comparator#compare(Object, Object)も自分で実装する必要もないみたいですし
abstractにもなっている(こちらの意義はまだ理解できてません)
勉強時間をとって追いつかなくては・・


[ メッセージ編集済み 編集者: kuma 編集日時 2007-11-14 11:07 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-14 11:31
重箱の隅つつきになってしまいますが、言い回しが気になります。

引用:

kumaさんの書き込み (2007-11-14 11:02) より:
なるほどInterfaceも匿名クラスで定義できたんですね。


interfaceが匿名クラスで定義できるように読み取れてしまいます。
匿名クラスという構文(機構)を用いることで、Interfaceを実装したクラスが定義できます。
#これでもまだ言い回しは正しくないかもしれない

出来上がるのはinterfaceではなく、具象クラスです。


nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-11-14 11:58
個人的にはMapを汎用データ型として使っていることの方が気になりますね。
ソートのキーとなる2つの項目があるのでしょうが、
これらをフィールドとして持つクラスを新たに定義してやるほうがよいでしょう。

MapのValueの部分でIntegerをStringに変えるような変換していますが、
そもそもint型のフィールドとして持つことができる。

多様なソート順を必要とするならComparatorを用いることになるでしょうが、
Comparatorの型パラメータもクラス名で定義できるのですっきりしますし、
ソート順が単一ならComparableをクラスに実装してしまえばいい。

スキルアップ/キャリアアップ(JOB@IT)