Comparable和Comparator介面比較
Java提供了只包含一個compareTo()方法的Comparable介面。這個方法可以個給兩個物件排序。具體來說,它返回負數,0,正數來表明已經存在的物件小於,等於,大於輸入物件。
Java提供了包含compare()和equals()兩個方法的Comparator介面。compare()方法用來給兩個輸入引數排序,返回負數,0,正數表明第一個引數是小於,等於,大於第二個引數。equals()方法需要一個物件作為引數,它用來決定輸入引數是否和comparator相等。只有當輸入引數也是一個comparator並且輸入引數和當前comparator的排序結果是相同的時候,這個方法才返回true。
連結:https://www.nowcoder.com/questionTerminal/99f7d1f4f8374e419a6d6924d35d9530
來源:牛客網
Comparator位於包java.util下,而Comparable位於包 java.lang下 Comparable 是一個物件本身就已經支援自比較所需要實現的介面(如 String、Integer 自己就可以完成比較大小操作,已經實現了Comparable介面) 自定義的類要在加入list容器中後能夠排序,可以實現Comparable介面,在用Collections類的sort方法排序時,如果不指定Comparator,那麼就以自然順序排序, 這裡的自然順序就是實現Comparable介面設定的排序方式。 而 Comparator 是一個專用的比較器,當這個物件不支援自比較或者自比較函式不能滿足你的要求時,你可以寫一個比較器來完成兩個物件之間大小的比較。 可以說一個是自已完成比較,一個是外部程式實現比較的差別而已。 用 Comparator 是策略模式(strategy design pattern),就是不改變物件自身,而用一個策略物件(strategy object)來改變它的行為。 比如:你想對整數採用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這麼做)去改變它的排序行為,只要使用一個實現了 Comparator 介面的物件來實現控制它的排序就行了。
Comparable的使用例子:
import java.util.Arrays; public class ComparableSample { public static void main(String[] args) throws Exception{ Student stu[] = {new Student("張三",22,80f) ,new Student("李四",23,83f) ,new Student("王五",21,80f)}; Arrays.sort(stu); //進行排序操作 for (int i = 0; i < stu.length; i++) { Student s = stu[i]; System.out.println(s); } } } class Student implements Comparable<Student>{ private String name; private int age; private float score; public Student(String name,int age,float score){ this.name = name; this.age = age; this.score = score; } @Override public int compareTo(Student stu) { //覆寫compareTo方法實現排序規則的應用 if(this.score>stu.score){ return -1; }else if(this.score<stu.score){ return 1; }else{ if(this.age>stu.age){ return 1; }else if(this.age<stu.age){ return -1; }else{ return 0; } } } public String toString(){ return "姓名:"+this.name+", 年齡:"+this.age+", 成績:"+this.score; } }
Comparator的列子:
import java.util.Iterator;
//Comparable是一個類部比較器而 Comparator是一個外部比較器
//comparator介面:
//元素的排序依據時刻變的,所以可以通過定義多個外部類的方式來實現不同的排序。使用時按照需求選取。
//建立外部類的代價太大。
public class ComparatorSample {
public static void main(String[] args) {
//ArrayList
ArrayList arrayList = new ArrayList();
arrayList.add(3);
arrayList.add(2);
arrayList.add(4);
Collections.sort(arrayList,new cmp());
Iterator it = arrayList.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
System.out.println("================");
Collections.sort(arrayList,new cmp2());
Iterator it2 = arrayList.iterator();
while (it2.hasNext()){
System.out.println(it2.next());
}
}
//升序比較器
public static class cmp implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
}
//降序比較器
public static class cmp2 implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
}
}