java對象排序(Comparable和Comparator)

1、Comparable簡介

Comparable是排序接口。若一個類實現了Comparable接口,就意味着該類支持排序。實現了Comparable接口的類的對象的列表或數組能夠經過Collections.sort或Arrays.sort進行自動排序。此外,實現此接口的對象能夠用做有序映射中的鍵或有序集合中的集合,無需指定比較器。該接口定義以下:數組

public class Field implements Comparable<Field> {

    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Field o) {
        //先比較age
        if(this.age > o.age){
            return this.age - o.age;
        }
        if(this.age < o.age){
            return this.age - o.age;
        }
        //再根據name進行比較
        if(this.name.compareTo(o.name) > 0){
            return 1;
        }
        if(this.name.compareTo(o.name) < 0){
            return -1;
        }

        return 0;
    }
}

測試類ide

public class ComparableTest {

    public static void main(String[] args){
        Field field1 = new Field("field1",18);
        Field field2 = new Field("field2",18);
        Field field3 = new Field("field3",23);
        Field field4 = new Field("field4",16);

        List<Field> list = Lists.newArrayList();
        list.add(field1);
        list.add(field2);
        list.add(field3);
        list.add(field4);
        //排序
        Collections.sort(list);

        for(Field field : list){
            System.out.println(field.getName()+" =="+field.getAge());
        }
    }
}

輸出結果函數

輸入圖片說明

2、Comparator簡介

Comparator是比較接口,咱們若是須要控制某個類的次序,而該類自己不支持排序(即沒有實現Comparable接口),那麼咱們就能夠創建一個"該類的比較器"來進行排序,這個"比較器"只須要實現Comparator接口便可。也就是說,咱們能夠經過實現Comparator來新建一個比較器,而後經過這個比較器進行排序。該接口定義以下:測試

public class Person {

    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

上面的Person類沒有實現Comparable接口,該如何比較大小呢?咱們能夠新建一個類,讓其實現Comparator接口,從而構造一個"比較器"。this

若一個類要實現Comparator接口:它必定要實現compare(T o1,T 02)函數,但能夠不實現equals(Object obj)函數。code

int compare(T o1,T o2)是"比較o1和o2的大小"。返回"負數",意味着"o1比o2小"返回"零",意味着"o1等於o2"返回"正數",意味着"o1大於o2"對象

咱們新建一個類,讓其實現Comparator接口,從而構造一個"比較器"。排序

public class PersonComparator implements Comparator<Person> {

    @Override
    public int compare(Person t1, Person t2) {
        //先比較age
        if(t1.getAge() > t2.getAge()){
            return t1.getAge() - t2.getAge();
        }
        if(t1.getAge() < t2.getAge()){
            return t1.getAge() - t2.getAge();
        }
        //再根據name進行比較
        if(t1.getName().compareTo(t2.getName()) > 0){
            return 1;
        }
        if(t1.getName().compareTo(t2.getName()) < 0){
            return -1;
        }
        return 0;
    }

}

測試類接口

public class ComparableTest {

    public static void main(String[] args){
        Person person1 = new Person("person1",18);
        Person person2 = new Person("person2",18);
        Person person3 = new Person("person3",23);
        Person person4 = new Person("person4",16);

        List<Person> list = Lists.newArrayList();
        list.add(person1);
        list.add(person2);
        list.add(person3);
        list.add(person4);
        //排序
        Collections.sort(list,new PersonComparator());

        for(Person person : list){
            System.out.println(person.getName()+" =="+person.getAge());
        }
    }
}

程序運行結果 輸入圖片說明圖片

3、Comparable和Comparator區別比較 兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 接口的對象直接就成爲一個能夠比較的對象,可是須要修改源代碼。 用Comparator 的好處是不須要修改源代碼, 而是另外實現一個比較器, 當某個自定義的對象須要做比較的時候,把比較器和對象一塊兒傳遞過去就能夠比大小了, 而且在Comparator 裏面用戶能夠本身實現複雜的能夠通用的邏輯,使其能夠匹配一些比較簡單的對象,那樣就能夠節省不少重複勞動了

相關文章
相關標籤/搜索