Comparable 和 Compator的區別

  • 1. Comparable 

  • 2. Compator

  • 3. Comparable 和 Compator 的區別 

1.Comparable 是一個接口,代碼如下, 其中T就是要比較的對象。

public interface Comparable<T> {
    public int compareTo(T o);
}

對於一個類Person 有兩個屬性 年齡和姓名,需求是我們根據其中的年齡進行排序。

public class Person {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

要比較,我們需要對用Person類實現Comparable接口,我們再代碼裏用到了Arrays.sort()來對數組進行排序,數組中的每個元素是實現了Comparable接口的對象,具體代碼如下:

import java.util.Arrays;

public class Person implements Comparable<Person> {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public int compareTo(@NotNull Person o) {
        return this.age - o.getAge();
    }

    public static void main(String[] args) {
        Person[] personArray = new Person[]{new Person(10, "Liam"), new Person(7, "Bob")};
        System.out.println("原來的順序");
        for (Person person : personArray) {
            System.out.print(person.getName() + "----" + person.getAge() + "    ");
        }
        System.out.println();
        System.out.println("後來的順序");
        Arrays.sort(personArray);
        for (Person person : personArray) {
            System.out.print(person.getName() + "----" + person.getAge() + "    ");
        }
    }
}

運行結果如圖 : 

我們可以看到要對對象進行排序,需要更改該對象對應的類的源碼

2.Compator 

Comapator接口,該接口有個compare 方法, 我們寫的實現類只需重寫該方法就可以了

public interface Comparator<T> {
    int compare(T o1, T o2);
    其餘的一些方法...
}

但是Compator 接口也有更多的 其他方法,感興趣的可以去看看

Person 類

public class Person {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

}

 我們只需寫一個比較器類,該類實現了Compator<T> 接口即可。

import java.util.Arrays;
import java.util.Comparator;

public class ComparatorPerson implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() -  o2.getAge();
    }

    public static void main(String[] args) {
        Person[] personArray = new Person[]{new Person(10, "Liam"), new Person(7, "Bob")};
        System.out.println("原來的順序");
        for (Person person : personArray) {
            System.out.print(person.getName() + "----" + person.getAge() + "    ");
        }
        System.out.println();
        System.out.println("後來的順序");
        Arrays.sort(personArray, new ComparatorPerson());
        for (Person person : personArray) {
            System.out.print(person.getName() + "----" + person.getAge() + "    ");
        }
    }
}

得出的結果是和使用Comparable結果是一致的,只是這個地方不用再源碼Person上修改代碼,而是新建一個比較器類

3.Comparable和Compator兩個的區別

Comparable 的使用,我們需要在源碼Person上重寫compareTo方法,而在Compator的使用中我們無需在源碼Person上重寫相關的方法,而是只需要新建一個比較器類即可,該比較器實現了Compator接口的compare方法。所以Comparable可以稱之爲內部比較器,而Compator可以稱之爲外部比較器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章