Tengo un error muy extraño. Me encontré con esto cuando originalmente estaba usando keySet() para iterar sobre las primeras 10 claves de un TreeMap grande. Una de las claves era devolver nulo, lo que no debería ser posible en mi opinión. Así que escribí el código de prueba a continuación:Clave en TreeMap que devuelve nulo
int i = 0;
for (Map.Entry<String, Integer> es : sortedMap.entrySet()){
if (i >= 10) {
break;
}
if (sortedMap.containsKey(es.getKey())){
System.out.println(es.getKey() + ":" + sortedMap.get(es.getKey()));
} else {
System.out.println("Key " + es.getKey() + " does not exist, yet...");
System.out.println("This does work: " + es.getKey() + ":" + es.getValue());
System.out.println("This does NOT work: " + es.getKey() + ":" + sortedMap.get(es.getKey()));
}
i++;
}
y obtener los siguientes resultados:
SOAP:967
'excerpt'::679
'type'::679
Key 'author_url': does not exist, yet...
This does work: 'author_url'::679
This does NOT work: 'author_url'::null
'date'::679
Android:437
TLS:295
message:283
server:230
monthly:215
<<<<<<<<<<<<<<<<<<<<DUMPING MAP!
{SOAP=967, 'excerpt':=679, 'type':=679, 'author_url':=679, 'date':=679, Android=437, TLS=295, message=283, server=230, monthly=215...
que cortar el mapa después de los diez primeros, ya que hay mucho más en allí, pero toda ella es una clave con un valor
Así que mi pregunta es esta: ¿Por qué estoy obteniendo un nulo cuando uso la clave para obtener directamente (clave) desde el TreeMap, pero el EntrySet devuelve la clave correcta y el valor?
Aquí es mi comparador ya que estoy pidiendo en Entero:
class ValueComparator implements Comparator<Object> {
Map<String, Integer> base;
public ValueComparator(Map<String, Integer> base) {
this.base = base;
}
public int compare(Object a, Object b) {
if ((Integer) base.get(a) < (Integer) base.get(b)) {
return 1;
} else if ((Integer) base.get(a) == (Integer) base.get(b)) {
return 0;
} else {
return -1;
}
}
}
Y el TreeMap se construye de la siguiente manera:
ValueComparator bvc = new ValueComparator(allMatches);
TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(bvc);
//Sort the HashMap
sortedMap.putAll(allMatches);
Dónde allMatches es un HashMap<String, Integer>
¿Está utilizando un comparador inusual para TreeMap? Si es así, ¿podemos ver su código? Se ve desde su volcado como si no estuviera usando el orden 'String' predeterminado ... –
@LouisWasserman Agregué mi comparador. –
¿Por qué tienes un constructor y un miembro en esa clase? El comparador normalmente se llama para cada elemento, por lo que no debe hacer referencia al mapa resultante. Tu código completo sería útil. – tom