質問

グアバでは可能ですか,

  1. で逆引き参照を実行するには BiMap キーと複数の値の場合?正確には、私はキーと対応する複数の値を持っています、私は値からキーを取得したいです。

  2. に複数の値を格納するには 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
}

追伸 を見てみましょう グアバのウィキ, 、これは両方を説明しています BiMapMultimap.

他のヒント

グアバで最も近いのは Multiset 複数の値をキーにマップするには、しかし、私はそれがあなたの要件を満たしている疑いがあります。

  1. これを行うには、値を使用してキーを検索することをお勧めします(複数の値が単一のキーにマップされている場合)、これを行うには、値が一意であり、デー Map<Key, Collection<Value>)一意の値を持つことは保証できません。
  2. グアバのもう1つのオプションは次のとおりです。 BiMap これは一意の値を必要とし、逆のマッピング(value->key)を提供できますが、複数の値を同じキーにマップする必要があるため、これも適切ではありません。

@xaerxess 彼の答えあなたの2番目の質問に、ListMultimapメソッドを使用してLinkedHashMapをバッキングマップとして使用する独自のMultimaps.newListMultimapを作成できます。

あなたの第1質問のために、あなたが複数の値にマッピングされている(つまり、Multimap)、メソッドを使用することができます。 Multimaps.invertFrom の反転コピーを作成する逆ルックアップを実行するためのオリジナルのMultimap。また、原稿のImmutableListMultimapコピーを作成し、逆のinverse()メソッドを使用して逆を取得することもできますが、Multimaps.invertFromのように原稿をコピーするだけです。

これはあなたが余分なメモリ消費を気にしないならば、それを多くの逆の検索をしたいのであれば、それを望んでいて、後に起こるオリジナルへの変更を最新の状態に保つ必要はないでしょう。あなたはそれを作成します。 1つの特定の値にマッピングされているキーを検索したい場合は、フルコピーを作成せずにエントリの1回の反復で実行できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top