天天看點

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 假設想排序, 也要實作一個比較器。

  1. 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() ).

  1. 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{

}

class PersonComparator implements Comparator {

public int compare(Person one, Person another) {

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

if(i == 0) { // 假設名字一樣,比較年齡,傳回比較年齡結果

return one.age - another.age;

Collections.sort( personList , new PersonComparator()) 能夠對其排序

4:總結

兩種方法各有優劣, 用Comparable 簡單, 僅僅要實作Comparable 接口的對象直接就成為一個能夠比較的對象,

可是須要改動源碼, 用Comparator 的優點是不須要改動源碼, 而是另外實作一個比較器, 當某個自己定義

的對象須要作比較的時候,把比較器和對象一起傳遞過去就能夠比大小了, 而且在Comparator 裡面使用者能夠自