Java TreeMap iterador não funcionar correctamente para chaves de corda
Pergunta
Eu tenho um TreeMap que mapeia chaves de corda para uma classe personalizada City. Aqui está como ele é instanciado:
TreeMap<String, City> nameDictionary = new TreeMap<String, City>(new CityNameComparator());
implementação CityNameComparator:
public class CityNameComparator implements Comparator<String>
{
public int compare (String c1, String c2) {
return c1.compareTo(c2);
}
}
Eu tenho um método que retorna um iterador que devem percorrer a mapa na ordem da chave-ascii:
public Iterator<City> getNameIterator(){
return nameDictionary.values().iterator();
}
Por alguma razão os valores são retornados na ordem em que foram adicionados à TreeMap. Alguma idéia?
Solução
Ele funciona muito bem:
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeMap;
public class test2 {
public static class City {
public final String m_name;
public City(String aName) {
m_name = aName;
}
}
public static class CityNameComparator implements Comparator<String>
{
public int compare (String c1, String c2) {
return c1.compareTo(c2);
}
}
public static class CityMap {
TreeMap<String, City> nameDictionary = new TreeMap<String, City>(new CityNameComparator());
public Iterator<City> getNameIterator(){
return nameDictionary.values().iterator();
}
public City put(String aName) {
return nameDictionary.put(aName, new City(aName));
}
}
public static void main(String[] args) {
CityMap cityMap = new CityMap();
cityMap.put("d");
cityMap.put("b");
cityMap.put("c");
cityMap.put("a");
for (Iterator<City> cities = cityMap.getNameIterator(); cities.hasNext(); ) {
City city = cities.next();
System.out.println(city.m_name);
}
}
}
Output:
a
b
c
d
Outras dicas
Você tem certeza de uma LinkedHashMap
não foi atribuído à referência Map
por engano? Isso seria preservar a ordem das entradas foram adicionadas ao mapa.
Ou talvez há um bug no código que está adicionando entradas, colocando o valor errado com uma chave.
Iterate sobre as entradas, e ver o que está no mapa:
for (Map.Entry<String, City> e : dictionary.entrySet())
System.out.println(e.getKey() + " --> " + e.getValue());
Desculpe, erro estúpido. Eu estava atribuindo um iterador diferentes com base em um erro em outro lugar. Ele funciona muito bem agora.