Contenido de certificación
Buscar
Social
Ofertas laborales ES
« Problema con iteración | Main | Bucle infinito en WeakHashMap no sincronizado »
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

octubre 26, 2012 | Unregistered CommenterPaMaY

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.

octubre 26, 2012 | Registered Commenterchoces

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);
}
}

octubre 28, 2012 | Registered Commenterchoces

Interesante, ¿cuál sería la alternativa a recorrer el mapa, aparte del iterador?

noviembre 5, 2012 | Registered Commenterjcarmonaloeches

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.

noviembre 6, 2012 | Registered Commenterchoces

foreach es super cómodo, todo hay que decirlo.

Gracias por el aporte, de momento eres el rey, @choces.

noviembre 7, 2012 | Registered Commenterjcarmonaloeches

Rey, sin corona ni trono, menos rey :D

noviembre 8, 2012 | Registered Commenterchoces

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>