java 比较器comparator原理_java中Comparator比较器顺序问题,源码分析

本文详细解析了Java中Comparator的工作原理,通过源码分析和测试代码展示了如何自定义比较规则实现降序排序。核心在于重写compare方法,通过判断条件和返回值控制元素顺序。此外,文章还探讨了二分法在排序过程中的应用。

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

提示:

分析过程是个人的一些理解,如有不对的地方,还请大家见谅,指出错误,共同学习。

源码分析过程中由于我写的注释比较啰嗦、比较多,导致文中源代码不清晰,还请一遍参照源代码,一遍参照本文进行阅读。

原理:先将集合中的部分元素排列好顺序。  然后再将剩余的元素用二分法插入到已排好序(二分法的使用是建立在已排好序的前提下)的元素中去。然后得到排好序的集合。

测试代码:

1 public classTestLambda {2 public static List list = Arrays.asList("my","name","is","lambda","mzp");3 public static List integerList = Arrays.asList(1,2,15,6,9,13,7);4

5 public static voidmain(String[] args) {6 System.out.println("排序前:");7 printList(integerList);8 oldIntegerSort();9 System.out.println("\noldSort排序后:");10 printList(integerList);11 }12

13

14 /**

15 * @Author maozp316 * @Description: 对String类型的lis就行排序。使用老方法(外部比较器Comparator)17 * @Date: 14:51 2019/7/518 * @Param []19 *@returnvoid20 **/

21 public static voidoldIntegerSort(){22 //排序(匿名函数)

23 Collections.sort(integerList, new Comparator(){24 //使用新的排序规则。比较器排序。25 //原理,先确定部分元素的顺序(升序或是降序),然后把剩余的元素通过"二分插入"进行排序。

26 @Override27 public int compare(Integer a, Integer b) { //源码中第一个入参(a)是数组靠后面的数,第二个入参(b)是数组靠前面的数(比如这里:a=2,b=1)

28 if(a <= b){ //由条件加上返回值来确定是升序还是降序 (如果全部返回-1的话,则实现逆序,将集合中的元素顺序颠倒)

29 return 1; //比如这里:原数组后面a的数小于前面的数b,返回1,1则表示这个顺序不需要调整。

30 }else{31 return -1; //比如这里:原数组后面的数a小于前面的数b,返回-1,-1则表示数组中现在的顺序需要调整。根据我们的代码,前两个元素是1和2,判断条件if(2<=1),返回的是-1,即不满足我们的期望。 下面排序的时候就会对顺序进行调整了。

32 }33 }34 });35 }36

37

38 /**

39 * @Author maozp340 * @Description: 打印集合元素41 * @Date: 10:38 2019/7/842 * @Param [list]43 *@returnvoid44 **/

45 public static void printList(Listlist){46 Iterator iterator =list.iterator();47 while(iterator.hasNext()){48 System.out.print(iterator.next()+",");49 }50 }

51 }

重写 Comparator 中的  compare 方法。自定义的比较规则:我这里自定义的比较器是:  期望得到  逆序排列

判断条件是:当a<=b时,返回1。否则返回-1;意思就是我期望的是“后一个元素比前一个元素小(即降序)”,如果已经满足,就不需要调换顺序(返回1),如果不满足,就需要调换一下顺序(返回-1)。

源码分析时,有一个我自己定义的“理念”,对于这个“理念”,这里有一个比较好的理解方法: a和b作比较时,a是比较者(主动),b就相当于是参照物(被比较者、被动)。

下面源码分析时用到这个所谓的“理念”的时候,会用到“主动”和“被动”这两个说辞。

测试数据:1,2,15,6,9,13,7

1 public static voidoldIntegerSort(){2 //排序(匿名函数)

3 Collections.sort(integerList, new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值