write seqio read descargar java hashmap

java - descargar - seqio read



"Transponer" un hashmap para key-> value to value-> key? (5)

Creo que hay suficientes soluciones para su problema aquí. Solo quiero señalar que tenga cuidado, porque eso puede causar la pérdida de datos si los valores no son únicos. Fe si tienes el siguiente mapa:

A->X B->Y C->Y

e invertirlo tendrás cualquiera

X->A Y->B

o

X->A Y->C

que depende del orden de las inserciones. Al invertirlo de nuevo, tendrá un par de <clave, valor> menos.

Digamos que tengo un mapa de pares clave -> valor, quiero revertir esto para que tenga un nuevo mapa que efectivamente es valor -> clave (es decir, el valor anterior se convierte en la nueva clave y la antigua se convierte en el nuevo valor).

¿Cuál es la mejor manera de hacer esto? (Estoy usando Java ...).

Oh y los valores son únicos.


Iterar sobre el conjunto de entrySet :

for ( Map.Entry<K, V> entry : map.entrySet() ) { newMap.put(entry.getValue(), entry.getKey()); } return newMap;


Puede utilizar cualquier clase que implemente la interfaz "BidiMap" en la colección común de Apache ( http://commons.apache.org/collections/ ). Esto es más eficiente porque el mapa bidireccional se construye cuando se llena y no hay necesidad de crear un nuevo mapa, lo que puede no ser práctico cuando el mapa es grande.

BidiMap aMap = new DualHashBidiMap(); aMap.put("B", "A"); aMap.put("A", "B"); aMap.put("C", "D"); aMap.put("X", "D"); MapIterator it = aMap.mapIterator(); System.out.println("Before Inverse"); while (it.hasNext()) { key = it.next(); value = it.getValue(); out.println(key + " -> " + value); } aMap = aMap.inverseBidiMap(); System.out.println("After Inverse"); it = aMap.mapIterator(); while (it.hasNext()) { key = it.next(); value = it.getValue(); out.println(key + " -> " + value); } Before Inverse A -> B B -> A X -> D After Inverse D -> X A -> B B -> A


Personalmente, utilizaría un Guava BiMap para empezar (con una implementación como HashBiMap ) y luego call inverse() cuando quería usar los valores como claves :)


Map<Type1,Type2> oldmap = getOldMap(); Map<Type2,Type1> newmap = new HashMap<Type2,Type1>(); for(Entry<Type1,Type2> entry : oldmap.entrySet()) { newmap.put(entry.getValue(),entry.getKey(); }