35

TreeMap のコンパレータが必要です。TreeMap のコンストラクターでこれを匿名で記述する必要がありますか? 他にどのようにコンパレータを書くことができますか。現在、Java は私のコードを気に入っていません (これを匿名で行うことはできますか?):

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<Entry<String, Double>>()
    {
        public int compare(Entry<String, Double> o1, Entry<String, Double> o2)
        {
            return o1.getValue().compareTo(o2.getValue());
        } 
    });
  1. 上記を匿名で行うことはできますか?
  2. 他にどうすればこれを行うことができますか?
  3. キーではなく値で myMap をソートしたい
4

3 に答える 3

68

値でTreeMapをソートすることはできません。

赤黒木ベースの NavigableMap 実装。マップは、キーの自然順序付けに従って、またはマップ作成時に提供された Comparator によって、どのコンストラクターが使用されているかに応じて並べ替えられcomparatorますComparator<? super K>

値の並べ替えを提供するには、 SortedSetが必要です。使用する

SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
            new Comparator<Map.Entry<String, Double>>() {
                @Override
                public int compare(Map.Entry<String, Double> e1,
                        Map.Entry<String, Double> e2) {
                    return e1.getValue().compareTo(e2.getValue());
                }
            });

  sortedset.addAll(myMap.entrySet());

例を挙げると

    SortedMap<String, Double> myMap = new TreeMap<String, Double>();
    myMap.put("a", 10.0);
    myMap.put("b", 9.0);
    myMap.put("c", 11.0);
    myMap.put("d", 2.0);
    sortedset.addAll(myMap.entrySet());
    System.out.println(sortedset);

出力:

  [d=2.0, b=9.0, a=10.0, c=11.0]
于 2012-10-18T04:30:43.700 に答える
17

コンパレータは、エントリ全体ではなく、キー専用にする必要があります。キーに基づいてエントリを並べ替えます。

次のように変更する必要があります

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<String>()
    {
        public int compare(String o1, String o2)
        {
            return o1.compareTo(o2);
        } 
});

アップデート

次のように実行できます(マップにエントリのリストを作成し、値に基づいてリストを並べ替えますが、マップ自体は並べ替えられないことに注意してください)-

List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet());
    Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() {
        @Override
        public int compare(Entry<String, Double> o1, Entry<String, Double> o2) {
            return o1.getValue().compareTo(o2.getValue());
        }
    });
于 2012-10-18T04:27:09.917 に答える