技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

Java の Map をソートする。

プログラミングの問題を解いていて必要になったので、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());