Подтвердить что ты не робот

Двунаправленная карта

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

4b9b3361

Ответ 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 Пакет.

Ответ 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;        }
    }