Карта - это математическая запись, которая не подразумевает, что возможно обратное отображение. Тем не менее, вы можете создать «обратное» отображение, если каждое отображаемое значение уникально. Естественно, вам придется инкапсулировать все манипуляции с данными в методах, которые соответствующим образом обновляют обе карты.
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) медленнее, но стоит меньше памяти.