Comparable接口和Comparator接口

前言

在实际应用中,我们往往有需要 比较两个自定义对象 大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的。所以 Java 中要 比较对象的大小 或者要 对对象的集合 进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系

一般 Java 中通过接口来实现两个对象的比较,比较常用就是 Comparable 接口和Comparator 接口

Comparable 接口

Comparable 接口使用场景

  • 一个类实现了 Comparable 接口,就意味着 该类支持排序,如果存在实现 Comparable 接口的类的 List 集合或 Array 数组,则该List 集合或 Array 数组可以通过 Collections.sortArrays.sort 来进行排序
  • 一个类实现了Comparable 接口,就意味着 该类支持两个对象比较大小

Comparable 接口源码

public interface Comparable<T> {
   
	
	public int compareTo(T o);
}
  • Comparable 可以让实现它的类的对象进行比较,具体的比较规则是按照 compareT()o 方法中的规则进行的,该方法的返回值有三种情况
  • e1.compareTo(e2) > 0e1 > e2
  • e1.compareTo(e2) = 0e1 = e2
  • e1.compareTo(e2) < 0e1 < e2

实现 Comparable 接口示例

  • 自定义类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ConsumInfo implements Comparable<ConsumInfo> {
   

    private int uid;

    private double price;

    @Override
    public int compareTo(@NotNull ConsumInfo o) {
   
        if (price < o.price) {
   
            return -1;
        } else if (price > o.price) {
   
            return 1;
        } else {
   
            return 0;
        }
    }
}
  • 测试类:这里以对象的集合进行排序为例,当然也可以进行两个对象的大小比较
@Slf4j
public class ComparableTest {
   

    public static void main(String[] args) {
   

        ConsumInfo consumInfo1 = new ConsumInfo(100, 400.0);
        ConsumInfo consumInfo2 = new ConsumInfo(200, 200.0);
        ConsumInfo consumInfo3 = new ConsumInfo(300, 100.0);
        ConsumInfo consumInfo4 = new ConsumInfo(400, 700.0);
        ConsumInfo consumInfo5 = new ConsumInfo(500, 800.0);
        ConsumInfo consumInfo6 = new ConsumInfo(600, 300.0);
        ConsumInfo consumInfo7 = new ConsumInfo(700, 900.0);
        ConsumInfo consumInfo8 = new ConsumInfo(800, 400.0);

        List<ConsumInfo> list = new ArrayList<>();
        list.add(consumInfo1);
        list.add(consumInfo2);
        list.add(consumInfo3);
        list.add(consumInfo4);
        list.add(consumInfo5);
        list.add(consumInfo6);
        list.add(consumInfo7);
        list.add(consumInfo8);
        log.info("排序前:------");
        for (ConsumInfo consumInfo : list) {
   
            log.info("consumInfo为:" + consumInfo);
        }

        // 排序
        Collections.sort(list);
        log.info("排序后:------");
        for (ConsumInfo consumInfo : list) {
   
            log.info("consumInfo为:" + consumInfo);
        }
    }
}
  • 结果
00:16:09.316 [main] INFO org.example.test.ComparableTest - 排序前:------
00:16:09.332 [main] INFO org.example.test.ComparableTest - consumInfo为:ConsumInfo(uid=100, price=400.0)
00:16:09.332 [main] INFO org.example.test.ComparableTest - consumInfo为:ConsumInfo
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值