プログラミングの問題を解いていて必要になったので、Javaの Map をソートする方法を以下に纏める。調べてみたところ、いろんな方法があるようだが、自分で試してみてうまくいった方法をここにメモしておく。
例えば、以下の map をソートするとする。
Map<Integer, String> map = new HashMap<>();
map.put(1, "test1");
map.put(4, "test4");
map.put(2, "test2");
map.put(3, "test3");
上記の map に対して、以下のコードにより、map の key や value でソートできる。
List<Map.Entry<Integer, String>> entries1 =
map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toList());
List<Map.Entry<Integer, String>> entries2 =
map.entrySet().stream()
.sorted(Map.Entry.comparingByKey(Comparator.reverseOrder()))
.collect(Collectors.toList());
List<Map.Entry<Integer, String>> entries3 =
map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toList());
List<Map.Entry<Integer, String>> entries4 =
map.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toList());
上記のコードでは、map からエントリーを取得してソートし、Map.Entry の List に格納している。List に格納している理由は、順序性の保証されない map ではなく、順序性の保証される List で扱うため。
ちゃんとソートできているかどうかは、以下のコードで確認できる。
for (Map.Entry<Integer, String> entry : entries1) {
System.out.println("Key: "+ entry.getKey() + ", Value: " + entry.getValue());
}
Map.Entry の詳細は以下。
Map.Entry (Java Platform SE 8)
ちなみに、TreeMap を使うと、自動的に key でソートされる。key でソートする分には、こっちの方が簡単に書ける。
Map<Integer, String> treeMap = new TreeMap<>();
Map<Integer, String> treeMapReverse = new TreeMap<>(Comparator.reverseOrder());