HashMap.containsValue - в чем смысл? - PullRequest
8 голосов
/ 29 марта 2010

У меня есть HashMap, и мне нужно получить элемент по его целочисленному значению. Я заметил, что есть функция containsValue (), но, похоже, мне все равно придется перебирать карту, чтобы найти правильный индекс.

Мой вопрос; зачем использовать containsValue (), если мне нужно пройти его потом?

Кроме того, я полностью упускаю суть? ; -)

Ответы [ 7 ]

7 голосов
/ 29 марта 2010

Карта отображает ключ на значение. Если у вас есть значение и вы знаете, что карта содержит это значение, зачем вам ключ больше?

С другой стороны, если вам действительно нужен ключ или у вас есть просто свойство значения, вы можете выполнить итерацию entrySet(), проверить значение и вернуть ключ, если он найден:

for (Map.Entry<Index,Value> entry : map.entrySet()) {
  if (entry.getValue().getXy().equals(xy)) {
    return entry.getKey();
  }
}
6 голосов
/ 29 марта 2010

Карта является ключом к хранилищу значений. Сказать, что значение содержится, дается только в качестве указания. Я думаю, что для того, чтобы иметь биективную ссылку, позволяющую вам извлечь ключ из значения, вы должны полагаться на такие вещи, как BiMap из google-collection

3 голосов
/ 29 марта 2010

HashMap (или Карта в целом) использует пары ключ / значение. Когда вы добавляете что-то на карту, вы должны указать ключ, и именно этот ключ будет использован позже при получении значения. Основываясь на реализации HashMap с заданным ключом, поиск значения выполняется за время O (1).

containsValue - полезный метод для проверки того, что HashMap содержит искомое значение, но я не совсем понимаю, почему вы используете это для получения искомого значения ??

Корректный способ использования карты будет выглядеть примерно так:

HashMap<Integer, Object> myMap = new HashMap<Integer, Object>();
myMap.put(1, object1);
myMap.put(2, object2);
myMap.put(3, object3);

Теперь вы можете получить свои объекты, выполнив:

Object myObject = myMap.get(1);

Если вы сделали:

myMap.containsValue (1);

это вернет false, поскольку 1 является ключом, а не значением. Вы могли бы сделать:

myMap.containsKey(1);

если вы просто хотите узнать, существует ли он, но при вызове нет проблем:

Object myObject = myMap.get(99);

было бы просто вернуть ноль, если бы не было ключа, 99.

Таким образом, суть в том, что вы правы, нет смысла использовать containsValue, когда вы пытаетесь получить значение. Используйте get или containsKey, если вы хотите сначала проверить существование.

2 голосов
/ 29 марта 2010

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

1 голос
/ 29 марта 2010

вы можете использовать containsValue () в тех случаях, когда вам не нужно обходить всю хеш-карту, например, если вы хотите добавить пару ключ-значение в hashmap, но перед этим вы хотите узнать, есть ли это значение в hashmap , В этом случае для операции добавления вам не нужно просматривать весь хэш-файл.

0 голосов
/ 29 июня 2019

Я думаю, что Map.containsValue - ошибка в дизайне интерфейса карты.

Одна очень редко сталкивается с реализациями Map, которые обеспечивают более быструю, чем линейную реализацию containsValue. Например, карта может внутренне представлять каждое отдельное значение в виде небольшого целого числа, а затем использовать битовые комбинации для представления наборов значений. Такая карта может быть в состоянии обнаружить в постоянное время, что она никогда не видела заданного значения раньше (хотя для получения положительного результата может потребоваться линейное время).

Однако операция, которая иногда занимает линейное время, а иногда занимает постоянное время, не является полезной основой для универсального алгоритма. Вы не можете заменить LinkedList на ArrayList и ожидать, что все будет работать хорошо, даже если они оба поддерживают произвольный доступ в своем API. Клиент, которому необходимо постоянное время, содержит свойствоValue должно поддерживать отдельный HashSet значений, чтобы быть уверенным в хорошей производительности. Клиенты, довольные линейной производительностью, могут сами написать цикл.

Даже если сопровождающие интерфейса Map также сожалеют о добавлении containsValue, они, конечно, уже не могут удалить его.

0 голосов
/ 21 сентября 2016

Позвольте мне перефразировать этот вопрос для Фредерика:

Хорошо, содержит функциюValue (), сравнивает ли она внутренне (свой входной параметр) с каждым "значением" в хэш-карте? Или он как-то использует хеширование (или другую технику) для генерации результата? В первом случае мы могли бы просто использовать итератор для обхода и сопоставления существования нашего значения со всеми «значениями» hashmap. Значение вопроса в производительности или скорости!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...