2012-09-05 24 views
12

Para un mapa como:¿El mismo orden de iteración en Map.keySet y Map.values?

Map<Integer, Integer> map = ...; 
map.put(1, 1); 
map.put(2, 2); 
map.put(3, 3); 
map.put(4, 4); 

¿Es este código ...

for (Integer i : map.keySet()) System.out.println(i); 
for (Integer i : map.values()) System.out.println(i); 

... de impresión garantizada la misma misma secuencia dos veces?

Si no, ¿hay alguna garantía en, por ejemplo, java.util.HashMap?

+0

posible duplicado de [es el orden de iteración de Java HashMap keySet() consistente?] (Http://stackoverflow.com/questions/1882762/is-the-java-hashmap-keyset-iteration-order-consistent) – assylias

+0

@ assylias: Esta pregunta se refiere a conjuntos de claves vs valores. – dacwe

+0

@daxwe es su pregunta: ¿los 2 bucles imprimen lo mismo si se llaman dos veces, o es su pregunta: ¿el bucle sobre las teclas y sobre los valores imprimen la clave/valor correspondiente en el mismo orden? – assylias

Respuesta

16

No, no hay garantía, aunque en la práctica sucederá (no hay una buena razón para que el mapa use un iterador diferente para las claves y valores).

Si usted quiere garantizar iteración fin, recorrer la entrySet():

for (Map.Entry<Integer,Integer> entry : map.entrySet()) 
    // ... 

que lo preguntas sobre HashMap, nota también que cualquier cambio en el mapa va a cambiar potencialmente iteración orden, como resultado de la mapbeing rehashed .

+0

Buena alternativa, muchas gracias :) – Luvie

+0

Acabo de leer el [Mapa javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#entrySet--) y no hay garantía de pedido para 'entrySet()'. ¿De dónde has sacado eso? – Roland

7

No, no se garantiza. Uno es Set y el otro es Collection, ninguno garantiza el pedido.

Si desea mantener el orden. Puede ser LinkedHashMap() con entrySet() ayudarte.

+1

+1 Incluso si se pidieron, no hay garantía de que tendrían el mismo pedido. ;) –

-1

Sí. Más o menos Puede usar una subclase de SortedMap, es decir, TreeMap. Eso mantendrá las llaves en un orden natural. (o puede darle un comparador específico). Pero cuando utiliza el mapa de árbol, TIENE que asegurarse de que el método compareTo "debe ser coherente con iguales". Lee los javadocs para más detalles. Pero, en resumen, sí, PUEDES ordenar un mapa.

+0

La pregunta no era si se puede ordenar un mapa, si el conjunto de claves devuelto por 'keySet()' y el conjunto de valores devueltos de 'valueSet()' se ordenará para que la clave n: th en el conjunto de claves corresponde al valor n: ésimo en el conjunto de valores. No hay tal garantía. Tampoco hay garantía de que el orden en el que se devuelven las claves y los valores de 'keySet()' y 'valueSet()' sean iguales para dos invocaciones consecutivas. – JHH

Cuestiones relacionadas