1. 程式人生 > >Comparable和Comparator介面比較

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;
        }
    }
}