Можете ли вы предложить какую-то карту или подобную структуру данных, где мы можем получить как ценность, так и ключ друг от друга на равной основе. То есть каждый может быть использован для поиска других.
Двунаправленная карта
Ответ 1
Java не имеет двунаправленной карты в своей стандартной библиотеке.
Используйте, например, BiMap<K, V>
из Google Guava.
Ответ 2
Если вы чувствуете, что боль приносит некоторую стороннюю библиотеку. Как насчет этого простого класса.
public class BiMap<K,V> {
HashMap<K,V> map = new HashMap<K, V>();
HashMap<V,K> inversedMap = new HashMap<V, K>();
void put(K k, V v) {
map.put(k, v);
inversedMap.put(v, k);
}
V get(K k) {
return map.get(k);
}
K getKey(V v) {
return inversedMap.get(v);
}
}
Убедитесь, что класс K и V имеет правильную реализацию hashCode.
Ответ 3
Наиболее распространенным решением является использование двух карт. Вы можете легко инкапсулировать их в класс с помощью дружественного интерфейса, расширив AbstractMap
. ( Обновление:. Это реализовано как Guava HashBiMap
: две карты)
Создание новой структуры данных с использованием только массивов и пользовательских классов имеет несколько преимуществ. Реализации карты - это легкие обертки структуры данных, которая индексирует ключи. Так как вам нужны два индекса, вы можете использовать две полные карты.
Ответ 4
Также попробуйте Apache Commons Collections 4 BidiMap Пакет.
Ответ 5
Google Guava содержит BiMap
(BiDirectional Map).
Ответ 6
хорошо для средней usecase, где вам нужен такой словарь, я не вижу ничего плохого в решении KISS, просто вернул ключ и значение наоборот, сохраняя накладные расходы второй карты или даже библиотеки только для этой цели
myMap.put("apple", "Apfel");
myMap.put("Apfel", "apple");
Ответ 7
Вы можете определить enum и определить вспомогательный метод для получения ключа. Производительность намного лучше по сравнению с BidiMap. Например
public enum Fruit {
APPLE("_apple");
private final String value;
Fruit(String value){
this.value=value;
}
public String getValue(){
return this.value;
}
public static String getKey(String value){
Fruit fruits[] = Fruit.values();
for(Fruit fruit : fruits){
if(value.equals(fruit.value)){
return fruit.name();
}
}
return null; }
}