Comparable与Comparator有什么区别?

73 篇文章 8 订阅
本文介绍了Java中Comparable和Comparator接口的使用。Comparable用于实现对象的自然排序,Comparator则用于自定义排序规则。通过实现Comparable接口,可以直接对对象列表进行排序,但需要修改源代码。Comparator提供了一种不修改源代码的排序方式,适合于需要多种排序规则的情况。文中给出了具体的代码示例,展示了如何根据年龄和体重进行不同方式的排序。
摘要由CSDN通过智能技术生成

一、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 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding路人王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值