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().

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