2012-11-30 31 views
9

如何進行TreeMap排序?比方說,你有以下地圖: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 

所以,如果它不是按字母順序又是什麼呢?

回答

23

它不僅是字母,但它也是上/下區分大小寫。

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 
+2

'new Comparator (){ public int compare(String o1,String o2){ return o1.compareToIgnoreCase(o2); } }' – Shawn

2

當你沒有通過任何Comparator通過構造,因此這將使用它的鍵的自然順序構造一個新TreeMap

在java中的自然順序是指lexicographical順序。

1

你實際上得到正確的輸出。

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

大寫字母比小寫字母

5

lexcographically更大作爲stated in the JavaDoc一個TreeMap「......根據其的自然順序進行排序。」(重點是我的)。

因此,你的結果是正確的,因爲小寫l大寫M在UTF「字母」的光。

如果您希望覆蓋默認行爲,則可以將Comparator提供給TreeMap構造函數。