1. 程式人生 > >comparator接口與Comparable接口的差別

comparator接口與Comparable接口的差別

new lis blog dcs 大小 top ng- 功能 邏輯

1. Comparator 和 Comparable 同樣的地方

他們都是java的一個接口, 而且是用來對自己定義的class比較大小的,

什麽是自己定義class: 如 public class Person{ String name; int age }.

當我們有這麽一個personList,裏面包括了person1, person2, persion3....., 我們用Collections.sort( personList ), 是得不到預期的結果的. 這時肯定有人要問, 那為什麽能夠排序一個字符串list呢:

如 StringList{"hello1" , "hello3" , "hello2"}, Collections.sort( stringList ) 能夠得到正確的排序, 那是由於 String 這個對象已經幫我們實現了 Comparable接口 , 所以我們的 Person 假設想排序, 也要實現一個比較器。
   
2. Comparator 和 Comparable 的差別

Comparable

Comparable 定義在 Person類的內部:

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

 由於已經實現了比較器,那麽我們的Person如今是一個能夠比較大小的對象了,它的比較功能和String全然一樣,能夠隨時隨地的拿來比較大小,由於Person如今自身就是有大小之分的。

Collections.sort(personList)能夠得到正確的結果。 Comparator Comparator 是定義在Person的外部的, 此時我們的Person類的結構不須要有不論什麽變化,如 public class Person{ String name; int age }, 然後我們另外定義一個比較器: public PersonComparator implements Comparator() {..比較Person的大小..}, 在PersonComparator裏面實現了怎麽比較兩個Person的大小. 所以,用這樣的方法,當我們要對一個 personList進行排序的時候, 我們除了了要傳遞personList過去, 還須要把PersonComparator傳遞過去,由於怎麽比較Person的大小是在PersonComparator裏面實現的, 如: Collections.sort( personList , new PersonComparator() ). 3. Comparator 和 Comparable 的實例 Comparable: 實現Comparable接口要覆蓋

s=17470874779923938404&entry=1&q=compareTo" class="bdcs-inlinelink" target="_blank">compareTo方法, 在compareTo方法裏面實現比較: 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) { // 假設名字一樣,比較年齡, 返回比較年齡結果 return age - another.age; } else { return i; // 名字不一樣, 返回比較名字的結果. } } } 這時我們能夠直接用 Collections.sort( personList ) 對其排序了. Comparator: 實現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) { // 假設名字一樣,比較年齡,返回比較年齡結果 return one.age - another.age; } else { return i; // 名字不一樣, 返回比較名字的結果. } } } Collections.sort( personList , new PersonComparator()) 能夠對其排序 4:總結 兩種方法各有優劣, 用Comparable 簡單, 僅僅要實現Comparable 接口的對象直接就成為一個能夠比較的對象,可是須要改動源碼, 用Comparator 的優點是不須要改動源碼, 而是另外實現一個比較器, 當某個自己定義的對象須要作比較的時候,把比較器和對象一起傳遞過去就能夠比大小了, 而且在Comparator 裏面用戶能夠自己實現復雜的能夠通用的邏輯,使其能夠匹配一些比較簡單的對象,那樣就能夠節省非常多反復勞動了。

comparator接口與Comparable接口的差別