Tengo datos que están organizados en una especie de formato de "clave-clave", en lugar de "clave-valor". Es como un HashMap, pero necesitaré una búsqueda O (1) en ambas direcciones. ¿Existe un nombre para este tipo de estructura de datos y se incluye algo como esto en las bibliotecas estándar de Java? (¿O quizás Apache Commons?)
Podría escribir mi propia clase que básicamente usa dos mapas reflejados, pero prefiero no reinventar la rueda (si esto ya existe pero no estoy buscando el término correcto).
java
map
hashmap
bidirectional
reverse-lookup
Dormir
fuente
fuente
Además de Apache Commons, Guava también tiene un BiMap .
fuente
Aquí hay una clase simple que usé para hacer esto (no quería tener otra dependencia de terceros). No ofrece todas las funciones disponibles en Maps, pero es un buen comienzo.
fuente
Si no se producen colisiones, siempre puede agregar ambas direcciones al mismo HashMap :-)
fuente
Aquí mis 2 centavos.
O puede usar un método simple con genéricos. Pedazo de pastel.
Por supuesto, debe tener un mapa con valores únicos. De lo contrario, uno de ellos será reemplazado.
fuente
Inspirado por la respuesta de GETah, decidí escribir algo similar yo mismo con algunas mejoras:
Map<K,V>
-Interfaceput
(al menos espero garantizarlo por este medio)El uso es como un mapa normal, para obtener una vista inversa de la llamada de mapeo
getReverseView()
. El contenido no se copia, solo se devuelve una vista.No estoy seguro de que esto sea totalmente infalible (en realidad, probablemente no lo sea), así que siéntete libre de comentar si notas algún defecto y actualizaré la respuesta.
fuente
Es una pregunta bastante vieja aquí, pero si alguien más tiene un bloqueo cerebral como yo y se tropieza con esto, espero que esto ayude.
Yo también estaba buscando un HashMap bidireccional, a veces las respuestas más simples son las más útiles.
Si no desea reinventar la rueda y prefiere no agregar otras bibliotecas o proyectos a su proyecto, ¿qué tal una implementación simple de matrices paralelas (o ArrayLists si su diseño lo exige)?
Tan pronto como conozca el índice de una de las dos claves, podrá solicitar fácilmente la otra. Entonces, sus métodos de búsqueda podrían verse algo como:
Esto es asumiendo que está utilizando estructuras orientadas a objetos adecuadas, donde solo los métodos están modificando estas matrices / ArrayLists, sería muy simple mantenerlas en paralelo. Incluso más fácil para ArrayList, ya que no tendría que reconstruir si cambia el tamaño de las matrices, siempre que agregue / elimine en conjunto.
fuente