Получить ключ ArrayListMultimap
-
20-09-2019 - |
Вопрос
Я использую Гуаву 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;
}
В общем случае, конечно, не обязательно существует уникальный ключ для данного значения, поэтому, если вы не знаете, что на вашей карте каждое значение встречается только с одним ключом, вам нужно будет указать поведение, например.если вам нужен первый ключ или последний ключ.