<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    于吉吉的技術博客

    建造高性能門戶網

      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 陳于喆 閱讀(893) 評論(0)  編輯  收藏 所屬分類: java數據結構

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


    網站導航:
     
    主站蜘蛛池模板: 成人毛片18女人毛片免费| 4虎永免费最新永久免费地址| 国产成人免费片在线观看| 亚洲欧洲国产成人精品| 99精品在线免费观看| 亚洲人成在线影院| 免费A级毛片无码视频| 亚洲美女视频一区二区三区| 91香蕉国产线观看免费全集 | 亚洲国产精品狼友中文久久久| 色综合久久精品亚洲国产| www国产亚洲精品久久久日本| 高潮毛片无遮挡高清免费视频| 亚洲电影日韩精品| 一区二区视频在线免费观看| 亚洲级αV无码毛片久久精品| 久久国产精品免费专区| 亚洲综合激情九月婷婷| 成人啪精品视频免费网站| AV激情亚洲男人的天堂国语| 又色又污又黄无遮挡的免费视| 国产精品内射视频免费| 亚洲av日韩av天堂影片精品| 中文字幕无码播放免费| 亚洲JLZZJLZZ少妇| 亚洲欧洲国产精品香蕉网| 最近最好最新2019中文字幕免费| 亚洲另类自拍丝袜第1页| 国产美女无遮挡免费视频 | 亚洲日本香蕉视频| 日本a级片免费看| 91在线视频免费观看| 亚洲精品福利你懂| 久久亚洲AV永久无码精品| 99热在线观看免费| 国产亚洲男人的天堂在线观看 | 亚洲第一页在线视频| 免费jjzz在在线播放国产| 99久久久国产精品免费牛牛四川| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲人成影院在线无码观看|