Comparable和Comparator

Comparable接口

若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。TreeSet集合想要实现自定义对象的排序必须实现Comparable接口。

实现此接口必须实现int compareTo(Object o)方法,返回负数、零、正数分别对应this大于、等于、小于o。

Comparable接口使用的代码演示

先定义一个类,实现Comparable接口

public class Teacher implements Comparable<Teacher>{//注意传入元素的泛型
    int id;
    String name;

    public Teacher(){}

    public Teacher(int id,String name){
        this.id = id;
        this.name = name;
    }

    //重写toString()方法
    public String toString(){
        return id + ":" + name;
    }

    @Override
    public int compareTo(Teacher o) {
        //this比o小,负数/this比o大,正数/this等于o,零
        return this.id - o.id;
    }
}

测试类代码如下:

public class Test {

    public static void main(String[] args){
        //定义一个ArrayList集合
        ArrayList<Teacher> arr = new ArrayList<>();

        Teacher t1 = new Teacher(2, "Jack");
        Teacher t2 = new Teacher(1, "Rose");
        Teacher t3 = new Teacher(3, "Sam");

        arr.add(t1);
        arr.add(t2);
        arr.add(t3);

        System.out.println(arr);
        //通过Collections.sort()方法,传入支持排序的对象组成的数组。
        Collections.sort(arr);
        System.out.println(arr);
    }
}

Comparator接口

若一个类没有实现Comparable接口,即不支持排序,我们可以自定义一个"比较器类",让其实现Comparator接口,通过"比较器类"实现排序。

实现此接口必须实现compare(Object o1,Object o2)方法,o1大于、小于、等于o2分别返回正数、负数、零。

Comparator接口使用的代码演示

新建一个Teacher类,代码如下:

public class Teacher{
    int id;
    String name;

    public Teacher(){}

    public Teacher(int id,String name){
        this.id = id;
        this.name = name;
    }

    //重写toString()方法
    public String toString(){
        return id + ":" + name;
    }

}

新建一个"比较器类",实现Comparator接口,注意要传入要比较的元素的泛型类型,一定要实现compare()方法。

public class TeacherComparator implements Comparator<Teacher> {//注意传入元素的泛型
    @Override
    public int compare(Teacher o1, Teacher o2) {
        //o1 < o2,负数/ o1 > o2,正数/o1 = o2,零
        return o1.id - o2.id;
    }
}

程序入口,测试代码如下:

    public static void main(String[] args){
        //定义一个ArrayList集合
        ArrayList<Teacher> arr = new ArrayList<>();
        Teacher t1 = new Teacher(2, "Jack");
        Teacher t2 = new Teacher(1, "Rose");
        Teacher t3 = new Teacher(3, "Sam");

        arr.add(t1);
        arr.add(t2);
        arr.add(t3);

        System.out.println(arr);
        //集合对象调用sort()方法,传入TeacherComparator对象
        arr.sort(new TeacherComparator());
        System.out.println(arr);
    }

运行结果如下:

[2:Jack, 1:Rose, 3:Sam]
[1:Rose, 2:Jack, 3:Sam]

Comparator和Comparable的区别

总的来说,

Comparable实现排序,通过要比较的对象元素实现接口,而Comparator实现排序,通过自定义"比较器类"实现接口。

一个是内部实现,一个是通过外部实现。

调用的方法、传递的参数也不同,

通过Comparable实现排序,一般要传入数组或集合对象。而通过Comparator实现排序,一般要传递比较器对象。

posted on 2021-10-18 06:13  技术小伙伴  阅读(47)  评论(0)    收藏  举报