java 比較器(Comparable)

如果想爲一組對象進行排序,那麼必須有一個可以區分出對象大小的關係操作,這個操作在Java中就是利用比較器完成的,java中提供了兩種比較器支持:java.long.Comparable和java.util.Comparator

1.如果要爲對象指定比較規則,那麼對象所在的類必須實現Comparable接口.

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

在這個接口中提供了一個compareTo()方法:要排序的數組所在的類一定要實現此接口,此接口返回的是int型數據,而用戶覆寫方法時只需要返回3中結果:1(>0)、-1(<0)、0(=0).

String類爲Comparable接口子類.所以在String類中提供了compaTo()方法進行字符串的大小比較.

實現比較器
在定義Person類時多實現了一個Comparable接口,而實現此接口就可以通過Arrays類的sort()方法進行數組排序了,所以以後不管哪種情況,只要牽扯到對象數組排序的操作,永遠都要使用比較器COmparable

package class5;

import java.lang.reflect.Array;
import java.util.Arrays;

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 if (this.age<o.age){
            return -1;
        }else {
            return 0;
        }
    }
}
public class TestDeao7 {
    public static void main(String[] args) {
        Person person[]=new Person[]{new Person("芷若",20),
        new Person("佳寧",18),
        new Person("姑姑",22)
        };
        Arrays.sort(person);
        System.out.println(Arrays.toString(person));
    }
}

運行實例
在這裏插入圖片描述

挽救的比較器
Comparable比較器實際上是在一個類定義時就具備的功能,那麼如果現在已經定義好的類該如何排序

已經定義好的類

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

}

此時沒有考慮排序要求,但是後來需要進行排序,但是類已經無法修改了,那麼如何使用Arrays.sort()排序呢?爲了解決這個問題,java提供了另外一個比較接口:java.util.Comparator接口,這個接口如下定義:
compare()方法存在兩個參數用於比較大小,而想要使用這個接口,需要定義比較規則類.

public interface Comparator<T>{
     public int compare(T o1,T o2);
     public boolean equals(Object obj);
     }

定義Person類的補救比較規則類.

class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1,Person o2) {
        if(o1.getAge()>o2.getAge()){
            return 1;
        }else if (o1.getAge()<o2.getAge()){
            return -1;
        }else {
            return 0;
        }
    }
}

而如果進行排序的話,依然使用Arrays類的sort()方法,只是方法需要更換.
使用Comparator比較:public static void sort(T[]a,Comparator<?super T>c)

實現排序

public class TestDeao7 {
    public static void main(String[] args) {
        Person person[]=new Person[]{new Person("芷若",20),
        new Person("佳寧",18),
        new Person("姑姑",22)
        };
        Arrays.sort(person,new PersonComparator());//對象數組排序
        System.out.println(Arrays.toString(person));
    }
}

java.lang.Comparable 是在一個類定義時默認實現好的接口,裏面只要一個compareTo()方法;
java.lang.Comparator是需要單獨定義一個比較規則類,裏面有兩個方法:compare()和equals().

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