1

以前は HashMap をその値でソートする必要があり、次のようにコレクションでコンパレーターを使用しました。

private LinkedHashMap<String, Integer> sortMap(Map<String, Integer> results, int count)
{
    List<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(results.entrySet());

    Comparator<Entry<String, Integer>> comparator = new Comparator<Entry<String, Integer>>() {
        @Override
        public int compare(Entry<String, Integer> a, Entry<String, Integer> b) {
            return b.getValue().compareTo(a.getValue());
        }
    };

    Collections.sort(entries, comparator);

    LinkedHashMap<String, Integer> sorted = new LinkedHashMap<String, Integer>();
    for (Entry<String, Integer> entry : entries)
        sorted.put(entry.getKey(), entry.getValue());

    return sorted;
}

状況が変わり、ソートされた HashMap である必要がありました。そこで、コードを次のように変更しました。

private LinkedHashMap<String, Double> sortMap(Map<String, Double> results, int count)
{
    List<Map.Entry<String, Double>> entries = new ArrayList<Map.Entry<String, Double>>(results.entrySet());

    Comparator<Entry<String, Double>> comparator = new Comparator<Entry<String, Double>>() {
        @Override
        public int compare(Entry<String, Double> a, Entry<String, Double> b) {
            return b.getValue().compareTo(a.getValue());
        }
    };

    Collections.sort(entries, comparator);

    LinkedHashMap<String, Double> sorted = new LinkedHashMap<String, Double>();
    for (Entry<String, Double> entry : entries)
        sorted.put(entry.getKey(), entry.getValue());

    return sorted;
}

エラーがスローされます。つまりjava.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double、次の場所です。

    at myPackage.myClass$1.compare(myClass.java:124)
    at myPackage.myClass$1.compare(myClass.java:1)
    at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at java.util.Collections.sort(Unknown Source)
    at myPackage.myClass.sortMap(myClass.java:128)

myClass.java.128 : Collections.sort(entries, comparator);
myClass.java.124 :return b.getValue().compareTo(a.getValue());

皆さんからの助けをいただければ幸いです。ありがとうございます。

4

2 に答える 2

1

次の 2 つの選択肢があります。

  1. ソート方法をIntegerの代わりにget に変更しますDouble

  2. の戻り値の型entry.getValue()を Double に変更してください!

于 2013-03-29T23:31:50.140 に答える
1

sortMap() メソッドのシグネチャを Integer から Double に変更しましたが、まだ Integer で呼び出しています。TreeMap を使用して、おそらく暗黙の並べ替えを行うためのオプションですか?

于 2013-03-30T00:25:35.490 に答える