Вопрос

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

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

if (myMap.containsValue(new Integer(1))
{
   // retrieve the key? 
}
Это было полезно?

Решение

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

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