0

我有一个将字符串键映射到自定义 City 类的 TreeMap。以下是它的实例化方式:

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

我有一个方法返回一个迭代器,它应该以 key-ascii 顺序遍历映射:

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

由于某种原因,这些值按照它们添加到 TreeMap 的顺序返回。有任何想法吗?

4

3 回答 3

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

输出:

一种

b

C

d

于 2009-10-04T20:45:27.400 回答
0

您确定LinkedHashMap没有Map错误地将 a 分配给参考吗?这将保留条目添加到地图的顺序。

或者代码中可能存在添加条目的错误,将错误的值放入键中。

遍历条目,查看地图中的内容:

for (Map.Entry<String, City> e : dictionary.entrySet()) 
  System.out.println(e.getKey() + " --> " + e.getValue());
于 2009-10-04T19:19:01.247 回答
0

对不起,愚蠢的错误。我根据其他地方的错误分配了一个不同的迭代器。它现在工作正常。

于 2009-10-04T20:50:50.890 回答