Comparable与Comparator有什么区别?

一、Comparable接口

Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器

需求:请将两个对象之间的属性字段按照大小规则排序
如:  * 1.如何按照年龄大小排序呢?
     * 2.体重降序排列呢??
     * 3.按照年龄升序排列,年龄相同的体重升序排列???

代码:

public class Student implements Comparable<Student>{
    
    
    private int age;
    private String name;
    private int weight;
	
	...
	
	/**
     * 实现Comparable接口 重写compareTo方法即可
     * return表示的是 0 相同  0  1【正序】 -1【倒叙】
     * 优点:灵活
     * 缺点:每次指定规则
     *
     * 1.如何按照年龄大小排序呢?
     * return (this.age < o.age) ? -1 : ((this.age == o.age) ? 0 : 1);
     * 2.体重降序排列呢??
     * return -(this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1);
     * 3.按照年龄升序排列,年龄相同的体重升序排列???
     * if (this.age == o.age){
     *    return ((this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1));
     * }else{
     *    return (this.age < o.age) ? -1 : 1;
     * }
     */
	
	@Override
    public int compareTo(Student o) {
    
    
        // return 0;
        //return (this.age < o.age) ? -1 : ((this.age == o.age) ? 0 : 1);
        if (this.age == o.age){
    
    
            return ((this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1));
        }else{
    
    
            return (this.age < o.age) ? -1 : 1;
        }
    }
}

测试方法:

public class Comparable01 {
    
    
    public static void main(String[] args) {
    
    
        List<Student> list = new ArrayList<>();
        list.add(new Student(13,"张三",100));
        list.add(new Student(16,"李四",120));
        list.add(new Student(11,"王五",130));

        // Comparable: Collections.sort(list);  会报错 按照神魔来排序呢????
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }
}

二、Comparator接口【比较器】

若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数

public class Person {
    
    
    private int age;
    private String name;
    private int weight;
}

实现比较器的方法:

class PersonCompare implements Comparator<Person>{
    
    
    // 指定比较规则,和Comparable 的写法是一样的
    @Override
    public int compare(Person o1, Person o2) {
    
    
        // return 0;
        // 按照年龄升序排序
        return o1.getAge() - o2.getAge();
    }
}

测试方法:

public class Comparator01 {
    
    
    public static void main(String[] args) {
    
    
        List<Person> list = new ArrayList<>();
        list.add(new Person(13,"张三",100));
        list.add(new Person(16,"李四",120));
        list.add(new Person(11,"王五",130));
        // 创建一个比较的实现类,放入比较规则
        Comparator c = new PersonCompare();
        Collections.sort(list, c);
    }

}

三、总结

1.Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。

2.Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

3.Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

4.用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码

5.用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wyn_365/article/details/119803726