GuavaのBiMapとLinkedHashMapの問題
-
12-12-2019 - |
質問
グアバでは可能ですか,
で逆引き参照を実行するには
BiMap
キーと複数の値の場合?正確には、私はキーと対応する複数の値を持っています、私は値からキーを取得したいです。に複数の値を格納するには
LinkedHashMap
?正確には、キーの複数の値を何らかの順序で格納したいので、リスト内のキーの位置を取得できます。
解決
アド...1. はい、逆引きを行うことは可能です BiMap<K, V>
, 、あなたはただ電話します inverse
あなたの BiMap
そして、あなたは逆になります BiMap<V, K>
ビュー あなたの BiMap
.
例(Guavaのテストスイートから取得):
public void testMapConstructor() {
/* Test with non-empty Map. */
Map<String, String> map = ImmutableMap.of(
"canada", "dollar",
"chile", "peso",
"switzerland", "franc");
HashBiMap<String, String> bimap = HashBiMap.create(map);
assertEquals("dollar", bimap.get("canada"));
assertEquals("canada", bimap.inverse().get("dollar"));
}
アド...2. あなたが意味すると仮定します 「キー->複数の[コレクション]値を保存したい」 (Map<K, Collection<V>>
), ListMultimap
おそらくあなたが望むものです、より正確には ArrayListMultimap
(値の順序を保持する)または LinkedListMultimap
(キーと値の両方の順序を保持します)。あなたのオブジェクトが不変になる場合は、私はあなたが使うことを強くお勧めします ImmutableListMultimap
.
また、独自の実装を作成することもできます Multimap
を使用して 工場 (ビット冗長)、すなわち私は使う:
private static <K, V> ListMultimap<K, V> makeLinkedArrayListMultimap() {
return Multimaps.newListMultimap(Maps.<K, Collection<V>>newLinkedHashMap(),
new Supplier<List<V>>() {
@Override public List<V> get() {
return Lists.newArrayList();
}
});
}
public static void main(final String[] args) {
final ListMultimap<String, String> multimap = makeLinkedArrayListMultimap();
multimap.putAll("one", ImmutableList.of("zero", "three"));
multimap.putAll("two", ImmutableList.of("three", "four", "three"));
multimap.putAll("three", ImmutableList.<String>of()); // note that this doesn't add key to multimap
multimap.put("four", "forty-two");
System.out.println(multimap);
// prints {one=[one, three], two=[three, four, three], four=[forty-two]}
final List<String> listForOnes = multimap.get("one");
System.out.println(listForOnes.get(0));
// prints zero
}
追伸 を見てみましょう グアバのウィキ, 、これは両方を説明しています BiMap
と Multimap
.
他のヒント
@xaerxess 彼の答えあなたの2番目の質問に、ListMultimap
メソッドを使用してLinkedHashMap
をバッキングマップとして使用する独自のMultimaps.newListMultimap
を作成できます。
あなたの第1質問のために、あなたが複数の値にマッピングされている(つまり、Multimap
)、メソッドを使用することができます。 Multimaps.invertFrom
の反転コピーを作成する逆ルックアップを実行するためのオリジナルのMultimap
。また、原稿のImmutableListMultimap
コピーを作成し、逆のinverse()
メソッドを使用して逆を取得することもできますが、Multimaps.invertFrom
のように原稿をコピーするだけです。
これはあなたが余分なメモリ消費を気にしないならば、それを多くの逆の検索をしたいのであれば、それを望んでいて、後に起こるオリジナルへの変更を最新の状態に保つ必要はないでしょう。あなたはそれを作成します。 1つの特定の値にマッピングされているキーを検索したい場合は、フルコピーを作成せずにエントリの1回の反復で実行できます。