前言
参考该大神的博客,从源码分析comparator
https://blog.youkuaiyun.com/u013066244/article/details/78997869
然后根据自己的理解,总结了以下内容,纯属个人理解,用于使用比较器的时候判断升序还是降序的写法。
个人理解总结
compare(int o1,int o2){
排序其实是由三个数字同时决定的;
升序(默认,即官方定义,毕竟代码实现就是基于这个写的):
< -1
= 0 //或者 1效果是一样的;-1相同元素会发生位置调整
> 1
}
底层源码概述:
数组[o1,o2]源码对于一组数据会从首地址开始调用,向后遍历,即[o1,o2]比较的compare(o2,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)为升序。
若想改为降序排列,方法如下:
(1)o2.compareTo(o1)
(2)compare返回逻辑修改,即< return 1;> return -1;= return 0;