1

マップを値で並べ替える必要がある場合によく発生します。マップはJDKではそのためのものではなく、Guava(このようなものは1つのライナーのようですが、私はそれを完全には理解していませんでした)やApacheCommonsを使用しないことにしました。ところで、これは非常に人気のある質問ですが、ほとんどの答えは何らかの形で間違っています。

    Map<String, Long> map = new HashMap<String, Long>();
    // populate
    List<Map.Entry<String, Long>> list = new LinkedList<Map.Entry<String,Long>>();
    for (Map.Entry<String, Long> entry : map.entrySet()) {
        list.add(entry);
    }
    Collections.sort(list, new MapComparable());
    LinkedHashMap<String, Long> linkedMap = new LinkedHashMap<String, Long>();

    for (Map.Entry<String, Long> entry : list) {
        linkedMap.put(entry.getKey(), entry.getValue());
    }
}

    public static class MapComparable implements Comparator<Map.Entry<String, Long>>{

        public int compare(Entry<String, Long> e1, Entry<String, Long> e2) {
            return (e1.getValue()<e2.getValue() ? -1 : (e1.getValue()==e2.getValue() ? 0 : 1));
        }
    }

私の質問は、EntrySetをコレクションとの間で取得するためのより良い方法はありますか?見栄えが良くありません。

そして、これは信頼できますか?

4

2 に答える 2

2

私が思うに、あなたの方法はごくわずかに改善されています。

Queue queue = new PriorityQueue( map.size(), new MapComparable() );

queue.addAll( map.entrySet() );

LinkedHashMap<String, Long> linkedMap = new LinkedHashMap<String, Long>();

for (Map.Entry<String, Long> entry; (entry = queue.poll())!=null;) {
    linkedMap.put(entry.getKey(), entry.getValue());
}

つまり、並べ替え用に設計されたデータ構造を使用して並べ替えを行います。

一般的な注意として、次のようなコード

for (Map.Entry<String, Long> entry : map.entrySet()) {
    list.add(entry);
}

次のように短縮できます。

list.addAll( map.entrySet() );

あなたがsを扱っているときはいつでもCollection

また、私はこれだと思います:

public int compare(Entry<String, Long> e1, Entry<String, Long> e2) {
    return e1.getValue().compareTo(e2.getValue());
}

きれいです。

于 2011-06-04T08:46:59.790 に答える
2

二重のデータ構造を維持できます。1つMapは文字列->長い変換を提供するaとして設定され、もう1つListは順序付けられた変換を提供するまたは同様の構造として、両方を一緒に維持する全体的な構造を備えています。

于 2011-06-03T22:19:50.800 に答える