2009-10-04 2 views
0

У меня есть TreeMap, который сопоставляет строковые ключи для пользовательского класса City. Вот как это конкретизируется: реализацияJava TreeMap итератор не работает правильно для клавиш String

TreeMap<String, City> nameDictionary = new TreeMap<String, City>(new CityNameComparator()); 

CityNameComparator:

public class CityNameComparator implements Comparator<String> 
{ 
    public int compare (String c1, String c2) { 
     return c1.compareTo(c2); 
    } 
} 

У меня есть метод, который возвращает итератор, который должен перемещаться по карте в порядке ключ-ASCii:

public Iterator<City> getNameIterator(){ 
    return nameDictionary.values().iterator(); 
} 

По какой-то причине значения возвращаются в том порядке, в котором они были добавлены в TreeMap. Есть идеи?

+2

Можете ли вы опубликовать рабочий код, который реплицирует проблему? Я не вижу никаких очевидных ошибок, хотя наличие пользовательского компаратора, который просто использует естественный порядок String, в любом случае является бессмысленным. –

+0

Я не вижу причины, почему это не должно работать. Это всегда сработало для меня. –

ответ

3

Он работает просто отлично:

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

Выход:

в

б

c

d

0

Вы были уверены, что LinkedHashMap не был связан с кодом Map. Это сохранит порядок добавления записей на карту.

Возможно, есть ошибка в коде, который добавляет записи, помещая неправильное значение с помощью ключа.

перебирать записи, и посмотреть, что находится на карте:

for (Map.Entry<String, City> e : dictionary.entrySet()) 
    System.out.println(e.getKey() + " --> " + e.getValue()); 
0

Извините, глупая ошибка. Я назначал другой итератор, основанный на ошибке где-то в другом месте. Теперь он отлично работает.

Смежные вопросы