collection 5 - Comparable和泛型

要實現(xiàn)List進行排序我們看下API文檔
java.util:
Interface Collection,Interface Comparator
Class Collections
java.lang:
Interface Comparable

Class Collections中有個排序方法sort:

public static <T extends Comparable<? super T>> void sort(List<T> list)

這個方法申明說明了以下幾個內(nèi)容:
1.sort的入?yún)⑹荓ist
2.List中放入的類型是T
3.T是要實現(xiàn)了Comparable接口的類
4.Comparable的類型參數(shù)是T或者是T的父型
5.上面的Comparable是個接口说搅,為什么用extends 克伊?
以泛型的觀點來說哥放,extends這個關(guān)鍵詞代表的“是一個”且適用于類和接口

所有可以“排序”的類都實現(xiàn)了java.lang.Comparable接口。Comparable接口中只有一個方法羹幸,public int compareTo(Object obj): 該方法:
返回0,表示 this == obj
返回正數(shù)巧鸭,表示this > obj
返回負數(shù)涂召,表示 this < obj
實現(xiàn)了Comparable接口的類通過實現(xiàn)compareTo方法從而確定該類對象的排序方式。

該Name類實現(xiàn)了Comparable接口误澳,重寫compareTo方法

package mashibing.java;

public class Name implements Comparable<Name> {
 private final String firstName,lastName;
 
 public Name(String firstName,String lastName){
  if (firstName == null ||lastName == null)
   throw new NullPointerException();
  this.firstName = firstName;
     this.lastName = lastName;
 }
 
 public String firstName(){return firstName;}
 public String lastName(){return lastName;}
 
 public boolean equals(Object o){
  if (!(o instanceof Name))
   return false;
  Name n= (Name) o;
  return n.firstName.equals(firstName) && n.lastName.equals(lastName);
 }
 
 public int hashCode(){
  return 31*firstName.hashCode() + lastName.hashCode();
 }
 
 public String toString(){
  return firstName + " " + lastName;
 }
 
 @Override
 public int compareTo(Name n) {
  int lastCmp = lastName.compareTo(n.lastName);
  return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
 }
}

上面重寫的compareTo方法耻矮,接收一個Object類,強制將其轉(zhuǎn)換成Name類忆谓,先將lastName進行比較裆装,比較使用的是String類的重寫的compareTo方法下面展示的是String類別的compareTo方法,取了兩個長度值的最小值,依照次序來比較每個char的的值得大小倡缠,char中保存的是ACSII的值哨免,直到兩個字符的值不一樣,否則就返回兩個char字符的差值昙沦,如果在k大于兩個中的最小值的之前還沒有返回出來的一個值得話琢唾,那么就比較兩個長度的大小。

private final char value[];

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

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

看下下面主程序盾饮,使用了Collections.sort(names)采桃,對names這個List進行了排序,這個List中的元素是Name類型的丘损,Name按照API的sort的要求實現(xiàn)了Comparable接口重寫了compareTo方法普办。所以可以對該List進行排序。

import java.util.*;

public class test {
    public static void main(String[] args) {
        Name nameArray[] = {
            new Name("John", "Smith"),
            new Name("Karl", "Ng"),
            new Name("Jeff", "Smith"),
            new Name("Tom", "Rich")
        };

        List<Name> names = Arrays.asList(nameArray);
        Collections.sort(names);
        System.out.println(names);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徘钥,一起剝皮案震驚了整個濱河市衔蹲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吏饿,老刑警劉巖踪危,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猪落,居然都是意外死亡贞远,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門笨忌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓝仲,“玉大人,你說我怎么就攤上這事官疲「そ幔” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵途凫,是天一觀的道長垢夹。 經(jīng)常有香客問我,道長维费,這世上最難降的妖魔是什么果元? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮犀盟,結(jié)果婚禮上而晒,老公的妹妹穿的比我還像新娘。我一直安慰自己阅畴,他們只是感情好倡怎,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贱枣,像睡著了一般监署。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冯事,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天焦匈,我揣著相機與錄音,去河邊找鬼昵仅。 笑死缓熟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的摔笤。 我是一名探鬼主播够滑,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吕世!你這毒婦竟也來了彰触?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤命辖,失蹤者是張志新(化名)和其女友劉穎况毅,沒想到半個月后分蓖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡尔许,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年么鹤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片味廊。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒸甜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出余佛,到底是詐尸還是另有隱情柠新,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布辉巡,位于F島的核電站恨憎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏郊楣。R本人自食惡果不足惜框咙,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痢甘。 院中可真熱鬧喇嘱,春花似錦、人聲如沸塞栅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽放椰。三九已至作烟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砾医,已是汗流浹背拿撩。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留如蚜,地道東北人压恒。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像错邦,于是被迫代替她去往敵國和親探赫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法撬呢,類相關(guān)的語法伦吠,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法毛仪,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 從三月份找實習(xí)到現(xiàn)在搁嗓,面了一些公司,掛了不少箱靴,但最終還是拿到小米谱姓、百度、阿里刨晴、京東、新浪路翻、CVTE狈癞、樂視家的研發(fā)崗...
    時芥藍閱讀 42,246評論 11 349
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,104評論 0 62
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等茂契,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,497評論 0 3
  • 你奔跑的樣子 像一朵云 當你停來下 我就聽見了 露水的聲音 你的手 晃動像一面旗幟 在列車開動的瞬間 隨著鐵軌的震...
    鬼子不言閱讀 211評論 0 2