comparator接口與Comparable接口的區(qū)別

Comparator 和 Comparable 的區(qū)別

Comparable

Comparable 定義在 Person類的內(nèi)部:

public class Persion implements Comparable {..比較Person的大小..},

因?yàn)橐呀?jīng)實(shí)現(xiàn)了比較器,那么我們的Person現(xiàn)在是一個(gè)可以比較大小的對(duì)象了,它的比較功能和String完全一樣,可以隨時(shí)隨地的拿來比較大小,因?yàn)镻erson現(xiàn)在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結(jié)果。

Comparator

Comparator 是定義在Person的外部的, 此時(shí)我們的Person類的結(jié)構(gòu)不需要有任何變化,如

public class Person{ String name; int age },

然后我們另外定義一個(gè)比較器:

public PersonComparator implements Comparator() {..比較Person的大小..},

在PersonComparator里面實(shí)現(xiàn)了怎么比較兩個(gè)Person的大小. 所以,用這種方法,當(dāng)我們要對(duì)一個(gè) personList進(jìn)行排序的時(shí)候, 我們除了了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因?yàn)樵趺幢容^Person的大小是在PersonComparator里面實(shí)現(xiàn)的, 如:

Collections.sort( personList , new PersonComparator() ).

Comparator 和 Comparable 的實(shí)例

Comparable:

實(shí)現(xiàn)Comparable接口要覆蓋compareTo方法, 在compareTo方法里面實(shí)現(xiàn)比較:

public class Person implements Comparable {

String name;

int age

public int compareTo(Person another) {

int i = 0;

i = name.compareTo(another.name); // 使用字符串的比較

if(i == 0) { // 如果名字一樣,比較年齡, 返回比較年齡結(jié)果

return age - another.age;

} else {

return i; // 名字不一樣, 返回比較名字的結(jié)果.

}

}

}

這時(shí)我們可以直接用 Collections.sort( personList ) 對(duì)其排序了.

Comparator:

實(shí)現(xiàn)Comparator需要覆蓋 compare 方法:

public class Person{

String name;

int age

}

class PersonComparator implements Comparator {

public int compare(Person one, Person another) {

int i = 0;

i = one.name.compareTo(another.name); // 使用字符串的比較

if(i == 0) { // 如果名字一樣,比較年齡,返回比較年齡結(jié)果

return one.age - another.age;

} else {

return i; // 名字不一樣, 返回比較名字的結(jié)果.

}

}

}

Collections.sort( personList , new PersonComparator()) 可以對(duì)其排序

總結(jié)

兩種方法各有優(yōu)劣, 用Comparable 簡(jiǎn)單, 只要實(shí)現(xiàn)Comparable 接口的對(duì)象直接就成為一個(gè)可以比較的對(duì)象,但是需要修改源代碼, 用Comparator 的好處是不需要修改源代碼, 而是另外實(shí)現(xiàn)一個(gè)比較器, 當(dāng)某個(gè)自定義的對(duì)象需要作比較的時(shí)候,把比較器和對(duì)象一起傳遞過去就可以比大小了, 并且在Comparator 里面用戶可以自己實(shí)現(xiàn)復(fù)雜的可以通用的邏輯,使其可以匹配一些比較簡(jiǎn)單的對(duì)象,那樣就可以節(jié)省很多重復(fù)勞動(dòng)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評(píng)論 18 399
  • 項(xiàng)目中經(jīng)常會(huì)遇到列表搜索查詢,大部分的查詢是可以通過sql語句來實(shí)現(xiàn)的,有些特殊的搜索排序sql則實(shí)現(xiàn)不了,例如中...
    信徒_allen閱讀 2,708評(píng)論 0 1
  • 相同 Comparable和Comparator都是用來實(shí)現(xiàn)對(duì)象的比較、排序 要想對(duì)象比較、排序,都需要實(shí)現(xiàn)Com...
    Jeffbond閱讀 6,321評(píng)論 3 20
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,890評(píng)論 0 33
  • 溫柔的慈悲 —— 姑娘本無好壞,悲喜不為人知 剛過八點(diǎn)的樣子,急匆匆地走向教室。昨晚剛下過...
    碧小川閱讀 1,150評(píng)論 2 6

友情鏈接更多精彩內(nèi)容