質問

グアバを使っています ArrayListMultimap<K,V> コレクションからマップへ IntegersStrings. 。このクラスは次のメソッドを提供します。 containsValue(Object value) これは、マルチマップにキーの指定された値が含まれているかどうかを確認します。それが真実であると判断したら、そのキーを取得する最善の方法は何でしょうか?

ArrayListMultimap<String, Integer> myMap = ArrayListMultimap.create();

if (myMap.containsValue(new Integer(1))
{
   // retrieve the key? 
}
役に立ちましたか?

解決

使用する代わりに containsValue 繰り返すことができます myMap.entries() すべてのキーと値のペアのコレクションを返します。返されたコレクションによって生成された反復子は、1 つのキーの値を走査し、続いて 2 番目のキーの値を走査します。

Integer toFind = new Integer(1);
for (Map.Entry<String, Integer> entry: myMap.entries()) {
    if (toFind.equals(entry.getValue())) {
        // entry.getKey() is the first match
    }
}
// handle not found case

の実装を見てみると、 containsValue マップの値を反復処理するだけなので、これを実行するパフォーマンスは map.entries() の代わりに map.values() ほぼ同じはずです。

public boolean containsValue(@Nullable Object value) {
    for (Collection<V> collection : map.values()) {
      if (collection.contains(value)) {
        return true;
      }
    }

    return false;
}

もちろん、一般的なケースでは、特定の値に必ずしも一意のキーがあるとは限りません。そのため、マップ内の各値が単一のキーに対してのみ発生することがわかっている場合を除き、動作を指定する必要があります。最初のキーまたは最後のキーが必要な場合。

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