Java プログラミング

JavaのMapをvalueとkeyでソートする

JavaのMapを使用していてkeyでソートしたければTreeMapを使えばいいんですがvalueでソートしたい時が少しややこしい。

valueが同値ならkeyでソートしたい!ってなった時にかなり時間をかけてしまったのでメモしておこうと思います。

Map<Integer, Integer> testMap = new HashMap<>();
        testMap.put(1, 1);
        testMap.put(2, 1);
        testMap.put(3, 1);
        testMap.put(4, 4);
        testMap.put(5, 1);
        testMap.put(6, 2);

        // Entry(keyとvalueを持っている)のリストを作成する
        List<Entry<Integer, Integer>> entryList = new ArrayList<Entry<Integer, Integer>>(testMap.entrySet());

        // Comparatorを使用してEntryの値を比較する
        Collections.sort(entryList, new Comparator<Entry<Integer, Integer>>() {
            public int compare(Entry<Integer, Integer> obj1, Entry<Integer, Integer> obj2) {
               
          // valueが同じ(0)ならkeyを比較する(降順にする)
                if (obj1.getValue().compareTo(obj2.getValue()) == 0) {
                    return obj1.getKey().compareTo(obj2.getKey()) * -1;
                } else {
                    return obj1.getValue().compareTo(obj2.getValue()) * -1;
                }

            }
        });

       //keyとvalueを出力
        for (Entry<Integer, Integer> entry : entryList) {
            System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());
        }

出力結果

key:4 value:4
key:6 value:2
key:5 value:1
key:3 value:1
key:2 value:1
key:1 value:1

降順にするものを例示しているので昇順にしたければ比較してる部分で * -1を外してください。