5

重複の可能性:
Javaの値でMap <Key、Value>をソートする方法は?

TreeMapのようにソートされたマップが必要ですが、値でソートされています。私の地図は巨大になるので、必要なときにいつでも地図を並べ替えることはできません。この問題を解決するための良い解決策はありますか?たぶんこれを満たす外部jarが存在しますか?

4

4 に答える 4

1

要件を満たすには、いくつかの方法があります。その後、現在のオブジェクトに重複するオブジェクトがある可能性があることを明らかにしたので、サードパーティのマルチマップGuavaApache Commons Collections )に置き換えてから、キーと値を入れ替えるTreeMapことができます。つまり、に置き換えます。あなたの状況の詳細にもよりますが、これはあなたのために働く良いチャンスだと思います。TreeMapTreeMap<Key, Value>Multimap<Value, Key>

于 2012-11-22T15:34:30.067 に答える
0

データが一意である場合はSet、昇順で反復可能なデータを保持できます(実装すると仮定しますComparable)。

Mapその後、元のを保持するよりも多くの追加コストなしで個別に保持できますMap

于 2012-11-22T16:42:02.087 に答える
0

を使用しTreeMapて値のインデックスを維持している場合、つまり、主に特定のキーに一致する値をすばやく見つけるために使用している場合、2つのデータ構造を保持することもできます。

  • TreeMapインデックス作成に現在使用しているもの
  • ソートされた順序で値を反復処理するためのPriorityQueue(または他のソートされたリスト)

次に、変更があった場合は、両方のリストに値を追加および削除するだけです。このため、値のコピーを2つ保持する必要はありません。リストは値への参照でのみ機能するため、現在持っている1つのコピーを両方のリストに追加するだけです。

于 2012-11-22T15:43:29.133 に答える
0

これを効率的に行うことができるデータ構造は実際には存在しません。キーによる検索を効率的にするデータ構造を維持する必要あり、値を並べ替えると、その構造を維持することがより困難になります。

ただし、作成後にマップを変更しない場合は、次のようにすることができます。

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は、ソートされた値の順序で繰り返されます。

于 2012-11-22T16:04:04.303 に答える