說道Comparator 與 Comparable接口,就不得不說一下Collections和Arrays這兩個類,他們分別爲集合和數組提供一些查找、排序的操作。那麼就以Collections爲例,它有一個sort(),方法可以試下集合元素的排序。比如一個集合 ArrayList<Integer> arr,我們可以通過Collections.sort(arr),對其進行排序,那麼問題來了,Integer類型是數字自然可以進行排序,可是如果集合中的元素是一些我們自定義的對象怎麼辦呢???比如我們定義了一個Person類,ArrayList<Person> arr2,那麼顯然Collections.sort(arr2)是會報錯的,這時候怎麼辦呢,這就需要我們定義自己的比較器,Collection是中提供了另一個重載方法sort(Collection c,Comparater com)。
下面看例子:
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p11 = new Person1("x1",12);
Person1 p12 = new Person1("x2",13);
Person1 p13 = new Person1("x3",11);
Person1 p14 = new Person1("x4",10);
ArrayList<Person1> l1 = new ArrayList<Person1>();
l1.add(p11);
l1.add(p12);
l1.add(p13);
l1.add(p14);
Collections.sort(l1,new Comparator<Person2>() {
@Override
public int compare(Person2 o1, Person2 o2) {
// TODO Auto-generated method stub
return o1.age - o2.age;
}
});
}
}
class Person1{
public String name;
public int age;
public Person2(String name,int age){
this.name = name;
this.age = age;
}
}
這時候,有人說,這樣有點兒麻煩,我還是想用第一個sort()方法進行排序可以嗎???
當然可以,這個時候就用到了Comparable接口,我們可以讓Person實現Comparable接口,然後在Person內部定義自己的比較規則。
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person2 p21 = new Person1("x1",12);
Person2 p22 = new Person1("x2",16);
Person2 p23 = new Person1("x3",13);
Person2 p24 = new Person1("x4",15);
ArrayList<Person2> l1 = new ArrayList<Person2>();
l1.add(p21);
l1.add(p22);
l1.add(p23);
l1.add(p24);
Collections.sort(l1);
});
}
}
class Person2 implements Comparable<Person1>{
public String name;
public int age;
public Person1(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person1 o) {
// TODO Auto-generated method stub
return this.age - o.age;
}
}
}
這樣實現了同樣的功能。
總結:Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,通俗講Comparable是給類賦予可比較性,而Comparator 是在外部定義了一個比較器,與類本身並無關聯。
如果不是調用sort方法,相要直接比較兩個對象的大小,如下:
Comparator定義了倆個方法,分別是 int compare(T o1, T o2)和 boolean equals(Object obj),
用於比較兩個Comparator是否相等
有時在實現Comparator接口時,並沒有實現equals方法,可程序並沒有報錯,原因是實現該接口的類也是Object類的子類,而Object類已經實現了equals方法
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p21 = new Person1("x1",12);
Person1 p22 = new Person1("x2",16);
Comparator c = new Comparator<Person2>() {
@Override
public int compare(Person2 o1, Person2 o2) {
// TODO Auto-generated method stub
return o1.age - o2.age;
}
});
int k = c.compare(p21,p22);
}
}
class Person2{
public String name;
public int age;
public Person2(String name,int age){
this.name = name;
this.age = age;
}
}
Comparable接口只提供了 int compareTo(T o)方法,也就是說假如我定義了一個Person類,這個類實現了 Comparable接口,那麼當我實例化Person類的person1後,我想比較person1和一個現有的Person對象person2的大小時,我就可以這樣來調用:person1.comparTo(person2),通過返回值就可以判斷了;
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p11 = new Person1("x1",12);
Person1 p12 = new Person1("x2",13);
p11.compareTo(p12)
}
}
class Person1 implements Comparable<Person1>{
public String name;
public int age;
public Person1(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person1 o) {
// TODO Auto-generated method stub
return this.age - o.age;
}
}
}