代碼是:
import java.util.*;
public class Example21 { // 創建TreeMap測試類
public static void main(String[] args) {
TreeMap tm = new TreeMap(new MyComparator());// 傳入一個自定義比較器
tm.put("1", "Jack"); // 向集合存入學生的學號和姓名
tm.put("2", "Rose");
tm.put("3", "Lucy");
Set keySet = tm.keySet(); // 獲取鍵的集合
Iterator it = keySet.iterator(); // 獲得迭代器對象
while (it.hasNext()) {
Object key = it.next(); // 獲得一個鍵
Object value = tm.get(key); // 獲得鍵對應的值
System.out.println(key + ":" + value);
}
}
}
class MyComparator implements Comparator { // 自定義比較器
public int compare(Object obj1, Object obj2) {// 實現比較方法
String id1 = (String) obj1; // 將Object類型的參數強轉為String類型
String id2 = (String) obj2;
return id2.compareTo(id1); // 將比較之後的值返回
}
}
輸出結果是:
3:Lucy
2: Rose
1:Jack
當我把 return id2.compareTo(id1); 改成 return id1.compareTo(id2); 時
輸出結果是這樣的:1:Jack
2:Rose
3:Lucy
這是怎樣實現的? 能不能把實現過程表示出來?
謝謝了,各位
先插一句:TreeMap核心數據結構是紅黑樹,一種平衡二叉樹,所以TreeMap在查找和排序都是基於紅黑樹的。
TreeMap會根據key值進行排序保存,因為要排序就需要能比較大小,所以一般來說put到TreeMap中的key都應該是Comparable的子類;
如果是通過Tree傳入自定義的比較器,那麼排序結果由自定義的比較器比較結果確定,
compare(Object obj1, Object obj2)
上面返回值小於等於0,認為obj1 要排到obj2前,否則obj1 要排到obj2後
(注:在二叉平衡樹中,所謂的排前排後,就是在當前樹節點的左側還是在右側,在不涉及到數的排序算法情況下,這裡簡單說前後了)
當把 return id2.compareTo(id1); 改成 return id1.compareTo(id2); 時,TreeMap就被"騙"了,根據比較結果判斷得出了跟實際正好相反的結果,誤導了排序結果。
下面是TreeMap比較元素的方面,可以參考:
/**
* Compares two keys using the correct comparison method for this TreeMap.
*/
final int compare(Object k1, Object k2) {
return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
: comparator.compare((K)k1, (K)k2);
}
更詳細了解TreeMap,建議研究一下源碼。