黑馬程序員:Comparable vs Comparator

---------------------- android培訓java培訓、期待與您交流! ----------------------

今天忽然感覺黑馬論壇真的是個查落補缺的好地方,比如今天看別人的提問中用到了一個實現Comparator接口的類,我當時就懵了一下。之前要讓一個類可以被排序都是實現Comparable接口的,Comparator這個接口還真的是沒關注過。於是趕緊誠惶誠恐的去網上找有關內容學習,頓時茅塞頓開,曾經困然我的一個問題也迎刃而解。下面是我翻譯的一段英文資料。

Comparator接口與Comparable接口都是Java中用於支持對象比較的,繼承了這兩個藉口的類的對象可以按照某種預先設定好的規則被排序

實現了Comparable接口的類的對象,可以使用其自身與其他對象進行比較,也就是說實現了Comparable接口的類自身是可排序的;實現了Comparator接口的類的對象自身並不能被排序,這樣的類被稱爲比較器,比較器中包含了預先設定好的比較條件,用來給其他類的對象進行排序。

Comparable接口中要求必須實現的方法是:int compareTo(Object o1)

這個方法是將對象自身按照一定條件與另一個對象進行比較

如果對象本身大於o1則返回正數

如果對象本身等於o1則返回零

如果對象本身小於o1則返回負數

 

Comparator接口中要求必須實現的方法是:int compare(Object o1, Object o2)

這個方法是將其他類的兩個對象按照一定條件進行比較

如果o1大於o2則返回正數

如果o1等於o2則返回零

如果o1小於o2則返回負數

CollectionsArrays類除了提供了給實現Comparable接口的類進行排序的sort方法Collections.sort(List),Arrays.sort(Object[]),並且還接收比較器來對對象進行排序的sort方法sort(List, Comparator),Arrays.sort(Object[], Comparator)

之前,我曾經碰到過一個問題,就是說,有一個學生類

public classStudent {

   private String name;

   private int age;

   private int mark;

   /*

    * getter/setter 方法

    */

}

題目要求是用一個長度爲n的學生類的數組,要求在這個數組實現分別根據姓名,年齡和成績進行排序的功能,當時我只知道Comparable接口,或者說在寫這篇博客之前我也就知道Comparable接口。當時可把我費勁壞了,因爲Comparable接口只能以一個條件來進行排序,比如我用年齡作爲條件,那麼使用姓名和程序進行排序的方法我就要自己一點點慢慢寫,我記得當時我圖省事用了冒泡排序法來做的另外兩個功能。雖然說排序算法是程序員都要掌握的基礎知識,但是比如快速排序,堆排序,這樣的算法理解起來不難,但是實現起來還是挺麻煩的,尤其是快速排序算法,如果不適用遞歸來寫會很痛苦,但是程序員守則上的第一條我認爲就是,儘可能的不去適用遞歸。

現在有了Comparator接口就好了,對於我說的這個題目,完全可以實現三個不同的比較器,比如 SortByName, SortByAge, SortByMark這樣的三個比較器類,然後往Arrays.sort(Object[],Comparator)裏面一丟,好了,搞定~!

---------------------- android培訓java培訓、期待與您交流! ----------------------
詳細請查看:http://edu.csdn.net/heima


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章