2012-05-22 19 views
51

Tengo una asignación de enteros a cadenas simples en Java, pero necesito poder recuperar fácilmente cadenas de enteros, y también enteros de cadenas. He intentado mapa, pero puede recuperar sólo la cadena desde un entero, es una manera:Mapa bidireccional en Java?

private static final Map<Integer, String> myMap = new HashMap<Integer, String>(); 
// This works one way: 
String myString = myMap.get(myInteger); 

// I would need something like: 
Integer myInteger = myMap.getKey(myString); 

¿Hay una manera correcta de hacerlo para tener las dos direcciones?

Otro problema es que sólo tengo unos valores constantes que no cambian (1->"low", 2->"mid", 3->"high", por lo que no valdría la pena ir para una solución complicada.

Respuesta

50

Puede utilizar la API de Google para ese Colecciones , recientemente renombrado a Guava, específicamente un BiMap

a BIMAP (o "mapa bidireccional") es un mapa que conserva la singularidad de sus valores así como la de sus teclas. Esta restricción permite bimaps para apoyar una "vista inversa", que es otra bimap que contiene las mismas entradas que este bimap pero con claves invertidas y valores de .

+0

Ver http://stackoverflow.com/a/39329395/5466401 –

16

No hay un mapa bidireccional en la API estándar de Java. O puede mantener dos mapas usted mismo o usar el BidiMap de Apache Collections.

4

Uso de BiMap

Google Es más conveniente.

21

Crear Guava BiMap y obtener el valor invertido no es tan trivial.

ejemplo simple:

import com.google.common.collect.BiMap; 
import com.google.common.collect.HashBiMap; 

public class BiMapTest { 

    public static void main(String[] args) { 

    BiMap<String, String> biMap = HashBiMap.create(); 

    biMap.put("k1", "v1"); 
    biMap.put("k2", "v2"); 

    System.out.println("k1 = " + biMap.get("k1")); 
    System.out.println("v2 = " + biMap.inverse().get("v2")); 
    } 
} 
5

podría insertar tanto la clave, par de valores y su inversa en su estructura de mapa, pero tendría que convertir el entero a una cadena:

map.put("theKey", "theValue"); 
map.put("theValue", "theKey"); 

Uso map.get ("theValue") devolverá "theKey".

Es una manera rápida y sucia que he hecho mapas constantes, que sólo va a trabajar para un grupo selecto de los conjuntos de datos:

  • sólo contiene 1 a 1 pares
  • conjunto de valores es disjunta de la juego de llaves (1-> 2, 2-> 3) la rompe

Si desea mantener <Integer, String> se podía mantener un segundo mapa <String, Integer> de "poner" el valor -> pares de claves.

+5

sólo funciona si su clave y el valor son los mismos, o, posiblemente, si se utiliza 'Mapa ' – mlathe

+0

editado para la clarificación, gracias – Chicowitz

+0

Además , todas las claves y valores deben ser diferentes. –