重複の可能性:
Javaの値でMap <Key、Value>をソートする方法は?
TreeMapのようにソートされたマップが必要ですが、値でソートされています。私の地図は巨大になるので、必要なときにいつでも地図を並べ替えることはできません。この問題を解決するための良い解決策はありますか?たぶんこれを満たす外部jarが存在しますか?
重複の可能性:
Javaの値でMap <Key、Value>をソートする方法は?
TreeMapのようにソートされたマップが必要ですが、値でソートされています。私の地図は巨大になるので、必要なときにいつでも地図を並べ替えることはできません。この問題を解決するための良い解決策はありますか?たぶんこれを満たす外部jarが存在しますか?
要件を満たすには、いくつかの方法があります。その後、現在のオブジェクトに重複するオブジェクトがある可能性があることを明らかにしたので、サードパーティのマルチマップ(Guava、Apache Commons Collections )に置き換えてから、キーと値を入れ替えるTreeMap
ことができます。つまり、に置き換えます。あなたの状況の詳細にもよりますが、これはあなたのために働く良いチャンスだと思います。TreeMap
TreeMap<Key, Value>
Multimap<Value, Key>
データが一意である場合はSet
、昇順で反復可能なデータを保持できます(実装すると仮定しますComparable
)。
Map
その後、元のを保持するよりも多くの追加コストなしで個別に保持できますMap
。
を使用しTreeMap
て値のインデックスを維持している場合、つまり、主に特定のキーに一致する値をすばやく見つけるために使用している場合、2つのデータ構造を保持することもできます。
TreeMap
インデックス作成に現在使用しているものPriorityQueue
(または他のソートされたリスト)次に、変更があった場合は、両方のリストに値を追加および削除するだけです。このため、値のコピーを2つ保持する必要はありません。リストは値への参照でのみ機能するため、現在持っている1つのコピーを両方のリストに追加するだけです。
これを効率的に行うことができるデータ構造は実際には存在しません。キーによる検索を効率的にするデータ構造を維持する必要があり、値を並べ替えると、その構造を維持することがより困難になります。
ただし、作成後にマップを変更しない場合は、次のようにすることができます。
List<Map.Entry<Key, Value>> list = new ArrayList<Map.Entry<Key, Value>>(
map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Key, Value>>() {
public int compare(Map.Entry<Key, Value> e1, Map.Entry<Key, Value> e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
Map<Key, Value> sortedByValues = new LinkedHashMap<Key, Value>();
for (Map.Entry<Key, Value> entry : list) {
sortedByValues.put(entry.getKey(), entry.getValue());
}
結果のLinkedHashMapは、ソートされた値の順序で繰り返されます。