于吉吉的技術博客

          建造高性能門戶網

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            65 隨筆 :: 6 文章 :: 149 評論 :: 0 Trackbacks
          在深入了解TreeMap之前,有兩個接口要先弄清楚,分別是Comparable和Comparator

          Comparable & Comparator

          Comparable
          Comparable 此接口強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作)。

          它只有一個方法,int compareTo(T o),用來比較當前對象和傳入的參數,查看jdk api,共有這一批類實現了此接口,見下圖


          打開實現了該接口的Integer包裝類查看源碼

          public final class Integer extends Number implements Comparable<Integer> {

              
          public int compareTo(Integer anotherInteger) {
              
          int thisVal = this.value;
              
          int anotherVal = anotherInteger.value;
              
          return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
              }

          可以看到該方法通過當前的Integer對象的值是否大于傳入的參數來得到返回值,Integer的compareTo實現是按數字大小的自然排序,再找另一個例子String

          public final class String
              
          implements java.io.Serializable, Comparable<String>, CharSequence
          {
          public int compareTo(String anotherString) {
              
          int len1 = count;
              
          int len2 = anotherString.count;
              
          int n = Math.min(len1, len2);
              
          char v1[] = value;
              
          char v2[] = anotherString.value;
              
          int i = offset;
              
          int j = anotherString.offset;

              
          if (i == j) {
                  
          int k = i;
                  
          int lim = n + i;
                  
          while (k < lim) {
                  
          char c1 = v1[k];
                  
          char c2 = v2[k];
                  
          if (c1 != c2) {
                      
          return c1 - c2;
                  }
                  k
          ++;
                  }
              } 
          else {
                  
          while (n-- != 0) {
                  
          char c1 = v1[i++];
                  
          char c2 = v2[j++];
                  
          if (c1 != c2) {
                      
          return c1 - c2;
                  }
                  }
              }
              
          return len1 - len2;
              }

          可以看出String的compareTo實現是按字符串中字符的Unicode值進行排序的,也真是因為各種類實現的不同,所以只有在相互可比的類才能進行排序,否則會拋出java.lang.ClassCastException的異常。應該說Comparable是集合內部實現的排序,想要進行集合外的排序就需要Comparator接口。

          Comparator
          如果一個類不能實現Comparable接口,那么我們自己可以提供Comparator的排序,如果你不喜歡缺省的Comparator行為,照樣可以編寫自己的Comparator。

          Comparator只有2個方法,分別為int compare(T o1, T o2) 和boolean equals(Object obj)

          Comparator的compare方法的返回值和Comparable的compareTo返回值基本相似,如果排序第一個元素出現在第二個元素之前,則返回一個負值,如果第一個元素出現在第二個元素后面,返回一個正值,再否則,返回零。與Comparable不同的是Comparator是由用戶自行決定處理。
          通過一個小例子可以比較明確的看出

                class ComparatorTest implements Comparator{
                    
          public int compare(Object u1, Object u2) {
                      String uname1 
          = ((User)u1).getName();
                      String uname2 
          = ((User)u2).getName();
                      
          return uname1.compareTo(uname2);
                  }
                }
                
          class User {
                    
          private String name;
                    
          public String getName(){
                        
          return this.name;
                    }
                }

          Comparator比較函數強行對某些對象 collection 進行整體排序。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如 TreeSet 或 TreeMap)的順序。
          posted on 2011-06-15 15:07 陳于喆 閱讀(894) 評論(0)  編輯  收藏 所屬分類: java數據結構

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 禹州市| 礼泉县| 建平县| 宁阳县| 沁阳市| 三穗县| 罗甸县| 万源市| 栾城县| 巴里| 固阳县| 闸北区| 五峰| 绥阳县| 宣恩县| 彭泽县| 北川| 德州市| 宁陕县| 保靖县| 徐水县| 张掖市| 建水县| 姜堰市| 双流县| 图片| 桐城市| 徐闻县| 民勤县| 宣武区| 海伦市| 抚州市| 镇远县| 仁布县| 天峻县| 铜川市| 南江县| 元谋县| 德江县| 射洪县| 沈丘县|