プログラミングの問題を解いていて必要になったので、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 でソートできる。
// key で昇順にソート List<Map.Entry<Integer, String>> entries1 = map.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .collect(Collectors.toList()); // key で降順にソート List<Map.Entry<Integer, String>> entries2 = map.entrySet().stream() .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) .collect(Collectors.toList()); // value で昇順にソート List<Map.Entry<Integer, String>> entries3 = map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toList()); // value で降順にソート 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 でソートする分には、こっちの方が簡単に書ける。
// key で昇順にソート Map<Integer, String> treeMap = new TreeMap<>(); // key で降順にソート Map<Integer, String> treeMapReverse = new TreeMap<>(Comparator.reverseOrder());