2009-04-02 21 views

Respuesta

32

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 al Map 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 del BidiMap.

7

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.

1

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 una Map<K, V> que

  • le permite ver la "inversa" BiMap<V, K> con inverse()
  • garantiza que los valores son únicos, por lo que values() un Set

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 usar forcePut(key, value), pero eso será override the existing key-value pair.
Cuestiones relacionadas