Java中Comparable和Comparator对比

Comparable接口(自然排序)

说明:
1.系统的一些自带类,如String、包装类等已经实现了该接口,并重写了compareTo(obj)方法,规定了两个对象的比较大小方式
2.这些类如果进行排序,默认是从小到大
3.重写compareTo(obj)规则:
(1)如果当前对象大于形参对象obj,返回正整数
(2)如果当前对象等于形参对象obj,返回负整数
(3)如果当前对象小于形参对象obj,返回0

使用场景:
对于自定义类的对象我们想要进行排序,则可以让自定义类实现Comparable接口,重写compareTo(obj)方法,指明如何排序。

通俗解释:
Comparable带来比较能力,给类赋予一种比较大小的能力。

实例:

public class Goods implements Comparable{

    private String name;
    private double price;

    //指明商品比较大小的方式:按照价格从低到高排序,若价格相等,再按照产品名称从高到低排序
    @Override
    public int compareTo(Object o) {
        if(o instanceof Goods){
            Goods goods = (Goods)o;
            //方式一:
            if(this.price > goods.price){
                return 1;
            }else if(this.price < goods.price){
                return -1;
            }else{
               return -this.name.compareTo(goods.name);
            }
        }
        throw new RuntimeException("传入的数据类型不一致!");
    }
}

Comparator接口(定制排序)

说明:
1.造一个类,实现Comparator接口,重写compare方法,用这个类的对象充当比较器
2.通常使用匿名类匿名对象直接在排序方法中传入比较器
3.重写compare(Object o1,Object o2)规则:
(1)o1大于o2,返回正整数(不一定是返回1)
(2)o1等于o2,返回0
(3)o1小于o2,返回负整数

使用场景:对已经实现了Comparable接口的类想改变排序方式,只是临时用一下不想改类代码(如默认是升序,想改成降序),可以临时用Comparator实现。

通俗解释:
Comparator是一个比较器,使得对象依照这个比较器来比较

实例:

//匿名类的方式
Comparator com = new Comparator() {
    //指明商品比较大小的方式:照产品名称从低到高排序,再照价格从高到低排序
    @Override
    public int compare(Object o1, Object o2) {
        if(o1 instanceof Goods && o2 instanceof Goods){
            Goods g1 = (Goods)o1;
            Goods g2 = (Goods)o2;
            if(g1.getName().equals(g2.getName())){
                return -Double.compare(g1.getPrice(),g2.getPrice());
            }else{
                return g1.getName().compareTo(g2.getName());
            }
        }
        throw new RuntimeException("输入的数据类型不一致");
    }
}

//使用:
Arrays.sort(goods,com);
Collections.sort(goods,com);
new TreeSet(com);

两种方式对比

1、Comparable接口一旦实现,保证类的对象在任何位置都可以按此规则比较大小
2、Comparator属于临时性比较,通常是使用匿名类匿名对象方式直接在排序函数中传参

注意点

实现了Comparable接口的类,其对象之间只能调用compareTo函数比较大小,不能直接使用’>’、’<'等关系运算符比较

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值