2

にマップするためにGuavaの ArrayListMultimap<K,V>コレクションを使用しています。このクラスは、Multimapにキーに指定された値が含まれているかどうかをチェックするというメソッドを提供します。それが本当だと判断したら、そのキーを取得するための最良の方法は何ですか?IntegersStringscontainsValue(Object value)

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

if (myMap.containsValue(new Integer(1))
{
   // retrieve the key? 
}
4

1 に答える 1

3

使用する代わりに、すべてのキーと値のペアのコレクションを返すmyMap.entries()containsValueを反復処理できます。返されたコレクションによって生成されたイテレータは、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;
}

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

于 2009-09-01T16:12:48.313 に答える