ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Java »【Java】連想配列(Map)を値でソートする

【Java】連想配列(Map)を値でソートする  


 キーでのソート(昇順)は TreeMap を使えば勝手にやってくれる。しかし集計など、値でのソートをしたいことも多い。その場合はリストなどを中継し、Comparator で並び変えると良い。

●連想配列(Map)を値でソート(昇順/降順)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

//初期化
Map<String, Integer> map = new HashMap<String, Integer>(){ //TreeMap でも良い
{
put("Alice", 13);
put("Becky", 10);
put("Candy", 6);
put("Daisy", 99);
put("Eliza", 9);
}
};

//Map.Entry のリストを作る
List<Entry<String, Integer>> entries = new ArrayList<Entry<String, Integer>>(map.entrySet());

//Comparator で Map.Entry の値を比較
Collections.sort(entries, new Comparator<Entry<String, Integer>>() {
//比較関数
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue()); //昇順
//return o2.getValue().compareTo(o1.getValue()); //降順
}
});

//確認用
for (Entry<String, Integer> e : entries) {
System.out.println(e.getKey() + " = " + e.getValue());
}

//Java 8 なら...
//entries.forEach(e -> System.out.println(e.getKey() + " = " + e.getValue()));


 構造としてはキーと値のペア(Map.Entry)のリストを作り、そのリストをソートしている感じ。要素はオブジェクトの参照なので、キーでも値でも取り出せる。この例では Comparator を匿名クラスで作ってるが、「2次元配列のソート」のときのように、独立したクラスとして定義して置いて、フラグで昇順・降順を切り替えるのも良いだろう。


 キーを逆順(降順)ソートしたい場合は、同じような考え方でできる。

●連想配列(Map)をキーで降順ソート
//キーのリストを作る
List<String> keylist = new ArrayList<String>(map.keySet());

//Comparator でキーを降順ソート
Collections.sort(keylist, new Comparator<String>() {
//比較関数
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});

//確認用
for (String key : keylist) {
System.out.println(key + " = " + map.get(key));
}

//Java 8 なら...
//keylist.forEach(e -> System.out.println(e + " = " + map.get(e)));


 昇順なら Collections.sort(keylist) だけで良いね(TreeMap なら必要ない)。いずれにしても連想配列は順番(連番)という概念はあまりないので、List などを間に挟むと、色々操作しやすい。


(関連記事)
【Java】連想配列(Map)を foreach(for, forEach) で取り出す
【Java】配列, リスト(List), 連想配列(Map) の初期化
【Android】【Java】SparseArray で foreach
【Java】2次元配列のソート
【Java】配列要素の反転(reverse)


スポンサーサイト

category: Java

thread: プログラミング

janre: コンピュータ

tag: 連想配列  配列操作  ソート 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/173-5b051ed0
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop