example - colecciones java-keyset() vs entrySet() en el mapa
hashmap java example (5)
Puse un conjunto de elementos de matriz es un mapa donde los elementos de la matriz de cadena es la clave y la frecuencia de la palabra es el valor, por ejemplo:
String[] args = {"if","it","is","to","be","it","is","up","me","to","delegate"};
entonces el mapa tendrá entradas como [ if:1, it:2 .... ]
Set<String> keys = m.keySet();
System.out.println("keyset of the map : "+keys);
imprime todas las teclas: "if","it","is","to","be","it","is","up","me","to","delegate"
Set<Map.Entry<String, Integer>> entrySet = m.entrySet();
Iterator<Map.Entry<String, Integer>> i = entrySet.iterator();
while(i.hasNext()){
Map.Entry<String, Integer> element = i.next();
System.out.println("Key: "+element.getKey()+" ,value: "+element.getValue());
}
imprime todos los pares de valores clave:
Usando el set de entrada imprime todos los valores:
Key: if ,value: 1
Key: it ,value: 2
Key: is ,value: 2
Key: to ,value: 2
Key: be ,value: 1
Key: up ,value: 1
Key: me ,value: 1
Key: delegate ,value: 1
Pero el bloque de código a continuación debe imprimir exactamente la misma salida que arriba, pero no lo hace:
Iterator<String> itr2 = keys.iterator();
while(itr2.hasNext()){
//System.out.println(itr1.next()+" ");
//System.out.println(m.get(itr1.next())+" ");
System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));
}
Imprime:
Key: if ,value: 2
Key: is ,value: 2
Key: be ,value: 1
Key: me ,value: 1
Pero si descomentimos la línea 1 en el bucle while, es decir
System.out.println(itr1.next()+" ");
y comenta la linea
System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));
Luego obtenemos todas las claves: {"if","it","is","to","be","it","is","up","me","to","delegate"};
Si usamos m.get()
con itr2.next()
, entonces el iterador no tiene pocas claves.
Cada llamada a Iterator.next()
mueve el iterador al siguiente elemento. Si desea utilizar el elemento actual en más de una declaración o expresión, debe almacenarlo en una variable local. O incluso mejor, ¿por qué no simplemente usas un bucle for-each?
for (String key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}
Además, el bucle sobre el entrySet es más rápido, porque no consultas el mapa dos veces para cada clave. También Map.Entry
implementaciones de Map.Entry
suelen implementar el método toString()
, por lo que no tiene que imprimir el par clave-valor manualmente.
for (Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry);
}
Cada vez que llama a itr2.next () obtiene un valor distinto. No es el mismo valor. Solo debes llamar esto una vez en el bucle.
Iterator<String> itr2 = keys.iterator();
while(itr2.hasNext()){
String v = itr2.next();
System.out.println("Key: "+v+" ,value: "+m.get(v));
}
Hola @NCOMCOMPOOP para simplificar las cosas, tenga en cuenta que cada vez que lo haga it2.next () el puntero se mueve al siguiente elemento, es decir, aquí si lo nota cuidadosamente, entonces la salida está perfectamente bien de acuerdo con la lógica que ha escrito.
Esto puede ayudarte a comprender mejor:
1ra iteración del bucle While (el puntero está antes del 1er elemento): Clave: si, valor: 2 //{itr2.next()=if; m.get (itr2.next () = it) => 2}
2ª iteración del bucle While (el puntero está antes del 3er elemento): Clave: es, valor: 2 //{itr2.next()=is; m.get (itr2.next () = to) => 2}
3ra iteración del ciclo While (el puntero está antes del 5 ° elemento): Key: be, value: 1 //{itr2.next()="be "; m.get (itr2.next () = "arriba") => "1"}
4ta iteración del ciclo While (el puntero está antes del 7mo elemento): Key: me, value: 1 //{itr2.next()="me "; m.get (itr2.next () = "delegar") => "1"}
Key: if, value: 1 Key: it, value: 2 Key: is, value: 2 Key: to, value: 2 Key: be, value: 1 Key: up, value: 1 Key: me, value: 1 Key : delegar, valor: 1
Imprime:
Clave: si, valor: 2
Clave: es, valor: 2 Clave: se, valor: 1 Clave: yo, valor: 1
Un Iterator
solo avanza, si se lee una vez, se hace. Tu
m.get(itr2.next());
está leyendo el siguiente valor de itr2.next();
, es por eso que le faltan algunas teclas (en realidad no pocas, todas las demás).
entrySet()
mapa grande entrySet()
es mucho mejor que keySet()
. Consulte this tutorial sobre cómo optimizar el recorrido sobre el objeto grande con la ayuda de entrySet(
) y cómo ayuda a la optimización del rendimiento.