Java карты, переходя от значений к ключам - PullRequest
1 голос
/ 15 апреля 2011

Есть ли способ получить ключ, связанный с известным значением на карте?Обычно вы знаете ключ и хотите получить значение, но я хочу сделать наоборот, переходя от значения к ключу.Является ли это возможным?

Ответы [ 5 ]

2 голосов
/ 15 апреля 2011

Да, вам нужно перебрать значения на карте, а затем сохранить каждый ключ в списке:

for (Map.Entry<K,V> entry : map.entrySet()) {
  V value = entry.getValue();
  if (value.equals(someTargetValue) {
      // add key (entry.getKey()) to list
  }
}

Или вы можете использовать двунаправленную карту , хотя обратите внимание:

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

1 голос
/ 15 апреля 2011

Ну, я не эксперт по Google Project LambdaJ , но он, безусловно, предлагает несколько крутых альтернатив.

Предположим, у вас есть карта со всеми днями месяца:

month.put(1,"Monday");
month.put(2,"Tuesday");
month.put(3,"Wednesday");
...

Тогда мы могли бы легко достичь того, что вы хотите, например:

Set<Integer> result = with(month).retainValues(is("Friday")).keySet();

Или дажееще несколько интересных поисков, таких как:

Set<Integer> result = with(month).retainValues(anyOf(is("Monday"),is("Friday"))).keySet();
0 голосов
/ 29 декабря 2016

Здесь они уже говорили о Двунаправленных картах.В настоящее время Guava (https://github.com/google/guava) предлагает хороший BiMap, который вы можете использовать для этой цели:

https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap

0 голосов
/ 15 апреля 2011

Карта - это математическая запись, которая не подразумевает, что возможно обратное отображение. Тем не менее, вы можете создать «обратное» отображение, если каждое отображаемое значение уникально. Естественно, вам придется инкапсулировать все манипуляции с данными в методах, которые соответствующим образом обновляют обе карты.

Map<Key, Value> normal;
Map<Value, Key> reverse;

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

Map<Key, Value> normal;
Map<Value, List<Key>> reverse;

Наконец, если вам не нужен быстрый доступ, вы можете перебирать всю Карту в поисках значений. Поскольку вам понадобятся и Значение, и Ключ, вероятно, лучше всего перебрать элементы Map.Entry.

Value searchingFor = ...;
Map<Key, Value> normal;
List<Key> keys = new ArrayList<Key>();
for (Map.Entry<Key, Value> entry : normal.entrySet()) {
   if (entry.getValue().equals(searchingFor)) {
     keys.add(entry.getKey());
   }
}

Техника, которую вы выберете, будет сильно зависеть от того, лучше ли обменять скорость на объем памяти. Как правило, наличие дополнительной карты быстрее из-за хэширования значений (значений), но требует дополнительной памяти. Цикл над Map.Entry (s) медленнее, но стоит меньше памяти.

0 голосов
/ 15 апреля 2011

Без итерации всех ключей в поисках значения вы можете использовать Apache Commons BidiMap

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