2011-03-25 42 views
10

Tengo el siguiente código Java:Java iteración sobre un conjunto de claves

public void myMethod (final Map pFeatureGroupsFromPackage) { 

    final Set<String> keys = pFeatureGroupsFromPackage.keySet(); 

    for (final String key : keys) { 
      tmpList = (List<FeatureKey>) pFeatureGroupsFromPackage.get(key); 
    // do whatever 
    } 
} 

estoy recibiendo una advertencia de "FindBugs" decir lo siguiente:

Método myMethod hace uso ineficiente de iterador de conjunto de claves en lugar de entrySet iterador. La advertencia se realiza en la asignación tmpList.

No entiendo por qué esto es ineficiente. De hecho, la lista keys se calcula solo una vez. ¿Algún comentario? Gracias.

Respuesta

23

en lugar de iterar sobre el keySet y llamando get para obtener el valor correspondiente para cada tecla, iterar sobre la entrySet:

final Set<Map.Entry<String, List<FeatureKey>>> entries = pFeatureGroupsFromPackage.entrySet(); 

for (Map.Entry<String, List<FeatureKey>> entry : entries) { 
    String key = entry.getKey(); 
    List<FeatureKey> tmpList = entry.getValue(); 

    // do whatever 
} 

De esta manera no tiene que hacer una búsqueda en el mapa para cada tecla; usted obtiene directamente la clave y el valor de una vez.

Además, declare su Map con parámetros de tipo:

public void myMethod (final Map<String, List<FeatureKey>> pFeatureGroupsFromPackage) { 
    // ... 
} 
+0

Hola Jesper. Gracias por tu respuesta. Por cierto, hay dos errores de sintaxis (falta uno '>' y debe ser entrada en lugar de enty) :-) +1 y aceptado para usted – Luixv

+0

@Luixv gracias, corrigió los errores tipográficos. – Jesper

4

que está recibiendo todas las llaves y luego buscar todas las claves de la colección

una iteración Map.EntrySet sería mucho más rápido, un pequeño ejemplo:

Pero también debe utilizar los genéricos. ..

Set entries = map.entrySet(); 
     Iterator entryIter = entries.iterator(); 
     System.out.println("The map contains the following associations:"); 
     while (entryIter.hasNext()) { 
     Map.Entry entry = (Map.Entry)entryIter.next(); 
     Object key = entry.getKey(); // Get the key from the entry. 
     Object value = entry.getValue(); // Get the value. 
     System.out.println(" (" + key + "," + value + ")"); 
     } 
0

Podría ser que se está consultando el mapa dos veces: - en primer lugar para las llaves, - y en segundo lugar para los valores

Uso el iterador entryset iterará sobre el mapa una vez.

0

Acceder a HashMap a través de keySet iterator es incluso más rápido que usar el keySet iterator en TreeMap.

0

Hey Luixv, El motivo por el que el iterador de keysey es menos efectivo que el entryset iteratot es que con la primera opción, todavía tiene que usar Map.get (key) lookeup que se evita con la segunda opción.

3

Esto podría ayudarle a:

Map map = new HashMap(); 
Iterator entries = map.entrySet().iterator(); 
while (entries.hasNext()) { 
    Map.Entry entry = (Map.Entry) entries.next(); 
    Integer key = (Integer)entry.getKey(); 
    Integer value = (Integer)entry.getValue(); 
    System.out.println("Key = " + key + ", Value = " + value); 
} 
0

Código de ejemplo:

for (Map.Entry < Integer, List <FeatureKey>>> i: map.entrySet()) { 
    System.out.println(i.getValue() + " " + i.getKey())); 
} 
Cuestiones relacionadas