2010-02-16 32 views
9

Estoy tratando de bucle sobre un HashMap con el método keySet() de la siguiente manera:campo de conjunto de claves en HashMap es nulo

for (String key : bundle.keySet()) { 
    String value = bundle.get(key); 
    ... 
} 

que utilizan una gran cantidad de fines de cada bucles en HashMaps en otras partes de mi código, pero este como un comportamiento extraño: su tamaño es 7 (lo que es normal) pero keySet, entrySet y values son null (según el depurador Eclipse)!

El "paquete" variable se crea una instancia y se llena de la siguiente manera (nada original ...):

Map <String, String> privVar; 
Constructor(){ 
    privVar = new HashMap<String, String>(); 
} 
public void add(String key, String value) { 
    this.privVar.put(key, value); 
} 
+2

Si está haciendo muchas cosas para cada uno de los bucles en HashMaps, creo que es posible que desee cambiar su estructura. – Macarse

+0

Estoy de acuerdo con @Macarse. Además: * si * desea hacer un bucle sobre un 'Mapa' y necesita tanto las claves como los valores, generalmente es mucho mejor pasar por encima de 'entrySet()' para evitar búsquedas innecesarias para cada tecla. –

+0

Gracias por su sugerencia, Joachim, lo haré. @Macarse: Puse valores en parejas de valores-clave de mapas extraídos de archivos (hoja de cálculo de Excel) para aplicar un conjunto de reglas sintácticas (comprobaciones regExp) antes de crear una nueva hoja de cálculo. ¿Crees que los mapas no son un buen objeto para almacenar esto? –

Respuesta

18

¿Qué quiere decir por keySet, entrySet y values? Si se refiere a los campos internos de HashMap, entonces no debe mirarlos y no necesita preocuparse por ellos. Se usan para el almacenamiento en caché.

Por ejemplo, en la máquina virtual de Java 6 que utilizo keySet() se implementa como esto:

public Set<K> keySet() { 
    Set<K> ks = keySet; 
    return (ks != null ? ks : (keySet = new KeySet())); 
} 

Así que el hecho de que es keySetnull es irrelevante. keySet() (el método) nunca devolverá null.

Lo mismo ocurre con entrySet() y values().

+1

Parece que el depurador Eclipse muestra la información deseada en el campo 'tabla'. – Personman

+0

Devuelve nulo para mí en Java 7 utilizando data.keySet(). ToArray(); donde los datos son HashMap y no son nulos – tricknology

+0

@tricknology: si ese es el caso, sugiero que lo publique como una nueva pregunta (idealmente con un [SSCCE] (http://sscce.org) /)). –

Cuestiones relacionadas