Java comparator 从源码角度理解的总结分析方法

本文从源码角度探讨Java Comparator,总结个人理解,阐述compare方法如何决定升序或降序排列。通过分析,揭示了在数组排序中,compare方法的调用顺序以及如何影响排序结果。文章还提供了实现降序排列的两种方法:调换参数顺序和修改返回逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

参考该大神的博客,从源码分析comparator

https://blog.youkuaiyun.com/u013066244/article/details/78997869

然后根据自己的理解,总结了以下内容,纯属个人理解,用于使用比较器的时候判断升序还是降序的写法。

个人理解总结

compare(int o1,int o2){

排序其实是由三个数字同时决定的;

升序(默认,即官方定义,毕竟代码实现就是基于这个写的):

       < -1
       = 0 //或者 1效果是一样的;-1相同元素会发生位置调整
       > 1

}

底层源码概述:

数组[o1,o2]源码对于一组数据会从首地址开始调用,向后遍历,即[o1,o2]比较的compareo2,o1结果即o2-o1的正负值,以确定是升序还是降序。注意,此处o1,o2实际调用过程中的顺序。

对于一个数组[1,6,2,4,5],底层调用的是compare(6,1),6-1>0,故return 1,继续遍历compare(2,6),此时return -1,循环会结束,记录当前值也就是2的下标i,然后对前半部分已排序数组进行二分查找做插入排序,此时0~i区间内的数也已经按照升序排列了。

总结:

 c1.compareTo(c2)返回值有正、负、0;其功能相当于定义了compare(c1,c2)的比较大小的相减顺序为c1-c2

而对于实际数组[a,b,c] ,调用的是compare(b,a):

  • c1.compareTo(c2)为负数,c1<c2,即b<a,return -1;则子数组顺序逆转为[b,a],升序。没有比较的c进行二分法插入至[b,a]中。
  • c1.compareTo(c2)为正数,c1>c2,即b>a,return 1;则子数组顺序不变为[a,b],升序。继续向后遍历,compare(c,b)。

 

故调用默认的compare返回逻辑时,对于[a,b,c],o1.compareTo(o2)为升序。

若想改为降序排列,方法如下:

1o2.compareTo(o1)

2compare返回逻辑修改,即< return 1;> return -1;= return 0;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值