程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 二叉樹-Java treemap集合類,自定義比較器怎樣實現逆字典順序輸出的?

二叉樹-Java treemap集合類,自定義比較器怎樣實現逆字典順序輸出的?

編輯:編程綜合問答
Java treemap集合類,自定義比較器怎樣實現逆字典順序輸出的?

代碼是:
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,建議研究一下源碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved