viernes
oct262012
Recorrer un Map<K,V>
Puesto que Map<K,V> al igual que List<E> suelen ser dos de las estructuras de datos más usadas, propongo una discusión sobre la manera más eficiente de recorrer un Map<K,V> en función del resultado que queramos obtener.
1.- Hallar una clave determinada
2.- Hallar un valor determinado
3.- Hallar una combinación de clave y valor determinados.
Reader Comments (7)
Pues me imagino que todo el mundo lo hará así (pero seguro que no es lo mejor)
a) Habrá que hacer una iteración por las claves y terminar cuando la encuentres
b) Para el valor, si tienes la clave lo obtienes de forma directa y si no pues obtienes la colección de valores y hasta que lo encuentres.
c) Si conoces la clave pues obtienes el valor y punto.
Me imagino que la mejora evidente es optimizar la iteración y utlizar algún algoritmo de búsqueda.
Saludos
Lo interesante es que tanto claves como valores deban cumplir alguna condición determinada, para "obligar" a recorrer al Map ;)
Los Map se pueden recorrer de varias maneras; pero no todas son igual de eficientes en según qué casos.
Escogiendo el iterador más adecuado, se obtiene el recorrido más eficiente.
public void keys(final Map<Integer, String> mapa) {
for (final Iterator<Integer> it = mapa.keySet().iterator(); it.hasNext();) {
final Integer numero = it.next();
System.out.println("clave: " + numero);
}
}
public void values(final Map<Integer, String> mapa) {
for (final Iterator<String> it = mapa.values().iterator(); it.hasNext();) {
final String cadena = it.next();
System.out.println("valor: " + cadena);
}
}
public void all(final Map<Integer, String> mapa) {
for (final Iterator<Entry<Integer, String>> it = mapa.entrySet().iterator(); it.hasNext();) {
final Entry<Integer, String> entry = it.next();
final Integer numero = entry.getKey();
final String cadena = entry.getValue();
System.out.println("clave: " + numero + " valor: " + cadena);
}
}
Interesante, ¿cuál sería la alternativa a recorrer el mapa, aparte del iterador?
Esta es la manera más habitual:
public void keys(final Map<Integer, String> mapa) {
for (Integer key : mapa.keySet()) {
System.out.println("clave: " + key);
}
}
que al compilar genera un bytecode que es prácticamente idéntico al del mensaje anterior.
En realidad las colecciones usan siempre un iterador, y el foreach es solamente una manera abreviada de escribirlo. Puesto que NetBeans permite la refactorización de los foreach a su forma más próxima al resultado del compilador, hace más fácil la comprensión de que se usa un iterador.
foreach es super cómodo, todo hay que decirlo.
Gracias por el aporte, de momento eres el rey, @choces.
Rey, sin corona ni trono, menos rey :D