comparator接口與Comparable接口的差別
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接口要覆寫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 裡面使用者可以自
己實作複雜的可以通用的邏輯,使其可以比對一些比較簡單的對象,那樣就可以節省很多重複勞動了。
轉:https://www.cnblogs.com/sunflower627/p/3158042.html如有侵權請聯系删除