Можете ли вы предложить какую-то карту или подобную структуру данных, где мы можем получить как ценность, так и ключ друг от друга на равной основе. То есть каждый может быть использован для поиска других.
Двунаправленная карта
Ответ 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;        }
    }