18

TreeMap排序如何?例如,您有以下地图:

TreeMap<String, Integer> treemap = new TreeMap<>();
treemap.put("lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);

Iterator ittwo = treemap.entrySet().iterator();
    while (ittwo.hasNext()) {
    Map.Entry pairs = (Map.Entry)ittwo.next();
    System.out.println(pairs.getKey() + " = " + pairs.getValue());
    ittwo.remove();
}

这个的输出是:

Jesper = 3
Marc = 2
lol = 1

因此,如果它不是按字母顺序排列的,那么它是什么?

4

4 回答 4

34

它不仅按字母顺序排列,而且区分大小写。

TreeMap<String, Integer> treemap = new TreeMap<String, Integer>();
treemap.put("Lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);
treemap.put("lol1", 1);
treemap.put("marc1", 2);
treemap.put("jesper1", 3);

输出:

Jesper = 3
Lol = 1
Marc = 2
jesper1 = 3
lol1 = 1
marc1 = 2

因此,如果您不需要它,您可以使用自定义比较器,并以小写形式比较字符串:

TreeMap<String, Integer> treemap = new TreeMap<String, Integer>(new Comparator<String>() {
    public int compare(String o1, String o2) {
        return o1.toLowerCase().compareTo(o2.toLowerCase());
    }
});
treemap.put("Lol", 1);
treemap.put("Marc", 2);
treemap.put("Jesper", 3);
treemap.put("lol1", 1);
treemap.put("marc1", 2);
treemap.put("jesper1", 3);

输出:

Jesper = 3
jesper1 = 3
Lol = 1
lol1 = 1
Marc = 2
marc1 = 2
于 2012-11-30T09:53:11.933 回答
7

JavaDoc 中所述, TreeMap“...根据其的自然顺序进行排序...”(重点是我的)。

l因此,您的结果是正确的,因为小写字母在 UTF“字母表”中的大写字母之后。M

如果您希望覆盖默认行为,您可以ComparatorTreeMap构造函数提供 a。

于 2012-11-30T09:53:54.817 回答
2

由于您没有Comparator通过构造函数传递任何内容,因此这将TreeMap使用其键的自然顺序构造一个新的。

在java中,自然顺序意味着lexicographical顺序。

于 2012-11-30T09:53:16.470 回答
2

你实际上得到了正确的输出。

J(uppercase J)>M(uppercase M)>l(lowercase l). 

大写字母在字典顺序上大于小写字母

于 2012-11-30T09:53:24.813 回答