Java对象比较器

在Arrays类中有很多方法,Arrays.sort方法可实现对象的排序操作,例如:

        int []arr={1,5,9,3,2,6,4};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        String[] brr={"java","python","易语言","R语言"};
        Arrays.sort(brr);
        System.out.println(Arrays.toString(brr));

 运行结果:

[1, 2, 3, 4, 5, 6, 9]
[R语言, java, python, 易语言]

(注:该类的sort方法实现对整型数组的排序默认是由低到高顺序进行排序

而对字符串数组进行排序是根据编译器默认的编码进行排序) 

那么,怎么样才能实现对自定义类的对象进行排序呢?

首先,先查看Arrays类中的sort源码,其中有个名称是Comarable的接口(<T>中的T表示比较对象的类型),在该类中有个抽象方法为compareTo(要实现自定义对象的比较,这个抽象方法是需要被重写的)

在这个sort方法中,有两个接口: 

(1)Comparable接口: 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为 它的自然比较方法。

(2)Comparator接口: Comparable接口是要求自定义类去实现,按照OO原则:对修改关闭,对扩展开放。 那么如果这个类已经定义好了,不想再去修改它,那如何实现比较呢? Comparator接口:强行对某个对象collection进行整体排序的比较 。

我们以comparable接口为例:

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

public class Demo {
    public static void main(String[] args)  {

        person p1=new person("张三",8);
        person p2=new person("李四",19);
        System.out.println(p1.compareTo(p2));
        person[] arrr={p1,p2};
        Arrays.sort(arrr);
        System.out.println(Arrays.toString(arrr));

    }

}
class person implements Comparable<person>
{
    String name;
    int 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;
    }

    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) {
        return this.age-o.age;
    }
}

运行结果:

-11
[person{name='张三', age=8}, person{name='李四', age=19}]

上一篇:基于ESP32和ESP8266的物联网开发过程(二)


下一篇:JavaScript基础