Получить ключ ArrayListMultimap - PullRequest
       7

Получить ключ ArrayListMultimap

2 голосов
/ 01 сентября 2009

Я использую коллекцию Guava's ArrayListMultimap<K,V> для сопоставления Integers с Strings. Класс предоставляет метод с именем containsValue(Object value), который проверяет, содержит ли Multimap указанное значение для какого-либо ключа. Как только я определю, что это правда, каков наилучший способ получить указанный ключ?

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

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

1 Ответ

3 голосов
/ 01 сентября 2009

Вместо использования containsValue вы можете перебрать myMap.entries () , который возвращает коллекцию всех пар ключ-значение. Итератор, сгенерированный возвращенной коллекцией, обходит значения одного ключа, затем значения второго ключа и т. Д .:

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;
}

В общем случае, конечно, не обязательно иметь уникальный ключ для данного значения, поэтому, если вы не знаете, что на вашей карте каждое значение встречается только для одного ключа, вам нужно будет указать поведение, например, если вы хотели первый ключ или последний ключ.

...