Java 比较器Comparable和Comparator的使用和区别

1、Comparable和Comparator介绍

   在java中Intege,Double等基本数据类型和Sting都实现了Comparable接口,不用我们在自己去实现。对于类的比较,需要我们定义比较用到的字段比较逻辑。Comparable是内部比较器需要在类内部实现,Comparator是外部比较器生成比较器对象。

2、使用

(1)类实现Comparable接口重写comparato方法和传的参数进行对比

public class Persion implements Comparable<Persion> {
        private int age;
        private String name;
 
        public Persion(int age, String name) {
            this.age = age;
            this.name = name;
        }
 
        @Override
        public int compareTo(@NonNull Persion o) {
            if (this.age - o.age == 0)
                return 0;
            else
                return (o.age - this.age) > 0 ? 1 : -1;
        }
 
        @Override
        public String toString() {
            return "Persion{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

(2)创建一个比较器对象实现Comparator接口重写compara方法,对外部传入的两个类进行比较。

class PersionComparator implements Comparator<Persion> {
 
        @Override
        public int compare(Persion o1, Persion o2) {
            if (o1.age == o2.age) {
                return 0;
            } else {
                return (o1.age - o2.age) > 0 ? 1 : -1;
            }
        }
    }

两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动。

3、比较

List<Persion> list = new ArrayList<>();
        Persion p1 = new Persion(10, "小王");
        Persion p2 = new Persion(12, "小李");
        Persion p3 = new Persion(6, "小张");
        list.add(p1);
        list.add(p2);
        list.add(p3);
        Logger.e("Initiallist:" + list);
        Collections.sort(list);
        Logger.e("Comparablelist:" + list);
        Collections.sort(list, new PersionComparator());
        Logger.e("Comparatorlist:" + list);

输出Initiallist:[Persion{age=10, name=‘小王’}, Persion{age=12, name=‘小李’}, Persion{age=6, name=‘小张’}]

Comparablelist:[Persion{age=12, name=‘小李’}, Persion{age=10, name=‘小王’}, Persion{age=6, name=‘小张’}]

Comparatorlist:[Persion{age=6, name=‘小张’}, Persion{age=10, name=‘小王’}, Persion{age=12, name=‘小李’}]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值