比較器-Comparable和Comparator

在成长的土拨鼠發表於2024-11-13

Comparable是排序介面;若一個類實現了Comparable介面,就意味著“該類支援排序”。可以使用Arrays.sort()對改類進行排序

1.Comparable介面

使用場景:假如說我們有這樣一個需求,需要設計一個Person類,有兩個屬性:姓名(name)、年齡(age),按照年齡的大小進行排序,那麼實現可以這樣

注意:

public class Person implements Comparable<Person>{

    private String name;

    private int age;

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Person o) {
        if (this.age > o.age) {
            return 1;
        } else {
            return -1;
        }
//        return Integer.compare(this.age, o.age);
    }
}


public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("張三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people);
    System.out.println(Arrays.toString(people));
}

Comparable介面裡面有一個泛型T,T的選擇為可以與之比較的物件的型別,一般就是實現該介面類的本身,可以這樣想和Person類比較的當然是Person本身了。

2.Comparator介面

Comparator也是一個比較器,但是屬於挽救設計的一種,一般來說盡量減少。

使用場景:假如說我們有這樣一個需求,需要對Person類的年齡進行排序,但是Person類是別人寫好的,裡面沒有Comparable介面,如果在不允許改變原始碼的情況下,我們可以使用Comparator介面。

public class Person {

    private String name;

    private int age;

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class PersonComparator implements Comparator<Person> {

    @Override
    public int compare(Person o1, Person o2) {
        return Integer.compare(o1.getAge(), o1.getAge());
    }
}


public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("張三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people, new PersonComparator()); // 這裡需要加入比較器
    System.out.println(Arrays.toString(people));
}

// 當然上述的類為了方便檢視,所以專門寫出來,可以看到PersonComparator類中只有一個方法,可以使用匿名類的方式來進行編寫

public static void main(String[] args) {
    Person[] people = new Person[]{
            new Person("張三",25),
            new Person("李四",17),
            new Person("王五",35),
    };
    Arrays.sort(people, (p1, p2)-> Integer.compare(p1.getAge(), p2.getAge())); // 這樣寫就不需要類比較器了
//    Arrays.sort(people, Comparator.comparing(Person::getAge)); // 最簡寫法
    System.out.println(Arrays.toString(people));
}

總結
Comparable和Comparator的區別:

java.lang.Comparable:在類定義的時候,可以實現好的介面,裡面有compareTo這個方法需要實現。

java.util.Comparator:是挽救的比較介面,需要單獨定義一個比較類,裡面有compare比較方法。

在設計階段,我們使用比較多的是Comparable介面。

但在實際開發過程中的話,我們通常使用匿名內部類的方式,所以更多使用的是Comparator,不過一般是在演算法題中使用,真正在專案中使用的情況確實不多。

參考:

https://blog.csdn.net/qq_41474648/article/details/105182845

相關文章