于吉吉的技術(shù)博客

          建造高性能門戶網(wǎng)

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

          Comparable & Comparator

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

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


          打開實現(xiàn)了該接口的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));
              }

          可以看到該方法通過當(dāng)前的Integer對象的值是否大于傳入的參數(shù)來得到返回值,Integer的compareTo實現(xiàn)是按數(shù)字大小的自然排序,再找另一個例子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實現(xiàn)是按字符串中字符的Unicode值進行排序的,也真是因為各種類實現(xiàn)的不同,所以只有在相互可比的類才能進行排序,否則會拋出java.lang.ClassCastException的異常。應(yīng)該說Comparable是集合內(nèi)部實現(xiàn)的排序,想要進行集合外的排序就需要Comparator接口。

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

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

          Comparator的compare方法的返回值和Comparable的compareTo返回值基本相似,如果排序第一個元素出現(xiàn)在第二個元素之前,則返回一個負值,如果第一個元素出現(xiàn)在第二個元素后面,返回一個正值,再否則,返回零。與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比較函數(shù)強行對某些對象 collection 進行整體排序??梢詫?Comparator 傳遞給 sort 方法(如 Collections.sort),從而允許在排序順序上實現(xiàn)精確控制。還可以使用 Comparator 來控制某些數(shù)據(jù)結(jié)構(gòu)(如 TreeSet 或 TreeMap)的順序。
          posted on 2011-06-15 15:07 陳于喆 閱讀(895) 評論(0)  編輯  收藏 所屬分類: java數(shù)據(jù)結(jié)構(gòu)
          主站蜘蛛池模板: 鹤峰县| 阳泉市| 荔浦县| 宝坻区| 灯塔市| 山东| 章丘市| 太保市| 南和县| 托克托县| 新疆| 临朐县| 营口市| 五峰| 郑州市| 南宁市| 广昌县| 沈阳市| 白河县| 德阳市| 新河县| 桐柏县| 温宿县| 赤壁市| 松原市| 报价| 松滋市| 武功县| 古浪县| 庐江县| 义马市| 科尔| 宝坻区| 兖州市| 益阳市| 芦山县| 新化县| 临邑县| 亳州市| 广德县| 马边|