Necesito una colección que pueda buscar un valor basado en la clave y viceversa. Para cada valor hay una clave y para cada clave hay un valor. ¿Existe una estructura de datos lista para usar que haga esto?Java Collection - clave única y valor único
Respuesta
El BiMap de Google Guava parece que le conviene.
Un bimap (o "mapa bidireccional") es un mapa que conserva la exclusividad 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.
O el BidiMap de Apache Commons Collections:
Define un mapa que permite que las operaciones de búsqueda bidireccional entre la llave y los valores.
Esta extensión
Map
representa una asignación donde una clave puede buscar un valor y un valor puede buscar una clave con la misma facilidad. Esta interfaz se extiende alMap
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 delBidiMap
.
Puede usar BiMap desde Eclipse Collections (anteriormente GS Collections).
BiMap
es un mapa que permite a los usuarios realizar búsquedas desde ambas direcciones. Tanto las claves como los valores en BiMap son únicos.
La implementación principal es HashBiMap
.
inverse()
BiMap.inverse()
devuelve una vista donde se intercambian la posición del tipo de clave y tipo de valor.
MutableBiMap<Integer, String> biMap =
HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3");
MutableBiMap<String, Integer> inverse = biMap.inverse();
Assert.assertEquals("1", biMap.get(1));
Assert.assertEquals(1, inverse.get("1"));
Assert.assertTrue(inverse.containsKey("3"));
Assert.assertEquals(2, inverse.put("2", 4));
put()
MutableBiMap.put()
se comporta como Map.put()
en un mapa normal, excepto que lanza cuando se añade un valor duplicado.
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.put(1, "1"); // behaves like a regular put()
biMap.put(1, "1"); // no effect
biMap.put(2, "1"); // throws IllegalArgumentException
forcePut()
Esto comporta como MutableBiMap.put()
, pero en silencio elimina la entrada del mapa con el mismo valor antes de poner el par clave-valor en el mapa.
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.forcePut(1, "1"); // behaves like a regular put()
biMap.forcePut(1, "1"); // no effect
biMap.put(1, "2"); // replaces the [1,"1"] pair with [1, "2"]
biMap.forcePut(2, "2"); // removes the [1, "2"] pair before putting
Assert.assertFalse(biMap.containsKey(1));
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "2"), biMap);
Nota: Soy un confirmador de Eclipse Colecciones.
La respuesta aceptada menciona BiMap
, pero se ha convertido en more up-to-date con las bibliotecas de Google Guava.
Un
BiMap<K, V>
es unaMap<K, V>
que
- le permite ver la "inversa"
BiMap<V, K>
coninverse()
- garantiza que los valores son únicos, por lo que
values()
unSet
Entonces, puedes terminar con un código como este:
algunas advertencias con este objeto:
- usted no será capaz de agregar valores no únicos, o tendrá que obtener una
IllegalArgumentException
. Puede usarforcePut(key, value)
, pero eso será override the existing key-value pair.
- 1. ¿Índice único o clave única?
- 2. Java Script Collection Framework
- 3. Java Collection con 2 claves
- 4. ¿Cómo creo un valor único para cada clave usando dict.fromkeys?
- 5. Java HashMap: ¿Cómo obtener una clave y valor por índice?
- 6. Java HashMap Quitar clave/valor
- 7. IntegrityError valor clave duplicado viola la restricción única - django/postgres
- 8. Generación de clave única
- 9. MySQL - Clave externa única
- 10. Restricción única de Oracle e índice único
- 11. Restricción única frente a índice único
- 12. restricción único con valor definido
- 13. mysql clave única e índice
- 14. Almacenamiento y recuperación del valor de la clave Java HashMap
- 15. ¿Cuál es la diferencia entre Collection y List en Java?
- 16. .NET Garbage Collection Latency
- 17. CouchDB - Consulta de valor clave de la matriz para el primer elemento clave única
- 18. ¿Cómo funciona Garbage Collection en Java?
- 19. Java collection/map apply method equivalent?
- 20. Valor único Mysqli
- 21. Java Garbage Collection Mensajes de registro
- 22. Rendimiento de clase Collection en Java
- 23. Pregunta de rendimiento de Java Collection
- 24. Diferencia entre la clave principal, la clave única y la clave candidata
- 25. Prioridad de subproceso Java Garbage Collection
- 26. Java: cómo implementar `` toArray` para Collection`
- 27. clave única en toda la tabla mysql?
- 28. Obtener la clave de un elemento en un objeto Collection
- 29. de Java basada en disco de almacenamiento de clave-valor
- 30. Modificar el valor por la clave