Solución:
Parece que estás buscando un bimapa.
Las colecciones de Google (ahora parte de Guava) contienen una BiMap
interfaz con algunas implementaciones.
Desde el BiMap
documentación:
Un bimap (o “mapa bidireccional”) es un mapa que conserva la singularidad de sus valores así como la de sus claves. Esta restricción permite que los bimaps admitan una “vista inversa”, que es otro bimapa que contiene las mismas entradas que este bimapa pero con claves y valores invertidos.
los BiMap.inverse
El método parece devolver un Map
con los valores como claves y las claves como valores, de modo que Map
se puede usar para llamar get
en el valor y recuperar una clave.
Además, el Map
devuelto por inverse
es una vista de los datos subyacentes, por lo que no es necesario realizar copias adicionales de los datos originales.
Desde el BiMap.inverse
documentación del método:
Devuelve la vista inversa de este bimap, que asigna cada uno de los valores de este bimap a su clave asociada. Los dos bimaps están respaldados por los mismos datos; cualquier cambio en uno aparecerá en el otro.
Puede hacer una implementación simple como esta. Tenga en cuenta que los datos no se copian en esta implementación. ¡Solo las referencias lo son! He agregado la implementación para agregar y obtener. eliminar y otros métodos requeridos se dejan como ejercicio 🙂
public class TwoWayHashmap<K extends Object, V extends Object> {
private Map<K,V> forward = new Hashtable<K, V>();
private Map<V,K> backward = new Hashtable<V, K>();
public synchronized void add(K key, V value) {
forward.put(key, value);
backward.put(value, key);
}
public synchronized V getForward(K key) {
return forward.get(key);
}
public synchronized K getBackward(V key) {
return backward.get(key);
}
}
Y, por supuesto, su responsabilidad de aplicaciones para seguir incluso los ‘valores’ son únicos. Uso de ejemplo:
TwoWayHashmap twmap = new TwoWayHashmap<String, String>();
twmap.add("aaa", "bbb");
twmap.add("xxx", "yyy");
System.out.println(twmap.getForward("xxx"));
System.out.println(twmap.getBackward("bbb"));
Apache Commons también incluye BidiMap (mapa bidireccional).
Define un mapa que permite la búsqueda bidireccional entre clave y valores.
Este mapa extendido representa un mapeo donde una clave puede buscar un valor y un valor puede buscar una clave con la misma facilidad. Esta interfaz amplía Map y, por lo tanto, se puede utilizar en cualquier lugar donde se requiera un mapa. La interfaz proporciona una vista de mapa inversa, lo que permite un acceso completo a ambas direcciones del BidiMap.