Cómo crear un mapa de 2 vías en java

Necesito una estructura de datos para almacenar pares de valores string-int en una relación 1: 1, y poder también buscar de cualquier manera a su contraparte.

Escribí una clase con una Hashtable y una matriz String y almacené los datos 2 veces y usé las funciones integradas para la búsqueda.

Mi pregunta es, ¿hay alguna forma más agradable de lograr esto? Y por más bonito me refiero a ser eficiente y no almacenar los datos 2 veces, y preferiblemente sin escribir una tonelada de código: P.

Parece que puedes estar buscando un bimap.

Google Collections (ahora parte de Guava ) contiene una interfaz BiMap con algunas implementaciones.

De la documentación de BiMap :

Un bimap (o “mapa bidireccional”) es un mapa que conserva la singularidad de sus valores y la de sus claves. Esta restricción permite que bimaps admita una “vista inversa”, que es otra bimap que contiene las mismas entradas que este bimap pero con claves y valores invertidos.

El método BiMap.inverse parece devolver un Map con los valores como las claves, y las claves como los valores, de modo que el Map se pueda usar para llamar al valor y recuperar una clave.

Además, el Map devuelto por inverse es una vista de los datos subyacentes, por lo que no tiene que hacer copias adicionales de los datos originales.

De la documentación del método BiMap.inverse :

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 a 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 son! He agregado implementación para agregar y obtener. eliminar y otro método requerido se dejan como ejercicio 🙂

 public class TwoWayHashmap { private Map forward = new Hashtable(); private Map backward = new Hashtable(); 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 las aplicaciones para seguir incluso los ‘valores’ son únicos. Ejemplo de uso:

 TwoWayHashmap twmap = new TwoWayHashmap(); 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 (Bi Directional Map).

Define un mapa que permite la búsqueda bidireccional entre la clave y los valores.

Este Mapa ampliado representa un mapeo donde una clave puede buscar un valor y un valor puede buscar una clave con igual facilidad. Esta interfaz amplía el Mapa y, por lo tanto, puede usarse en cualquier lugar donde se requiera un mapa. La interfaz proporciona una vista de mapa inversa, que permite el acceso completo a ambas direcciones de BidiMap.

Google Collections Framework tiene un BiMap que hace lo que desea.

Usando guayaba ,

  HashBiMap map = HashBiMap.create(); map.put("name", "Sohail"); map.put("country", "Pakistan"); Log.d("tag", "name is " + map.get("name")); BiMapinvmap= map.inverse(); Log.d("tag", "Pakistan is a " + invmap.get("Pakistan")); 

lea el tutorial completo aquí.

Cree un hashmap que mapee Object to Object – luego puede usar el mismo mapa para almacenar String -> Integer and Integer -> String.

Cuando agrega un par de cadena / int, solo agréguela en ambos sentidos al mismo mapa.