前言
最近学习Collection,学习到对于list排序。对于普通数据的排序我们直接通过sort方法可直接排序,可对于list中存储的是对象,而且对于这个对象的两个属性进行排序。这时我们只能说去通过重写compare进行重写,将排序规则进行改变,从而实现我们所需要的排序。
源码
我们首先来看下sort方法的源码:
其中有两个参数,一个是存放数据的list,另一个参数就是规则参数,而对于这个规则,也就是我们需要进行重写的,只有将这个规则进行重写,才可以得到我们想要的排序方式。
Comparator
首先我们先来说下这个Comparator的接口。
Comparator接口用于对用户定义的类的对象进行排序。
该接口位于java.util包中,含有两个方法:
compare(Object obj1,Object obj2)
equals(Object element)
与Comparable使用场景不同,Compartor可以对任何对象进行排序
主要实现在一下场景:
需要对为实现Comparable接口的类进行比较,排序
已实现的Co'mparable接口的排序算法不符合要求,需要改写。
总结来说,小C我认为对于排序规则上的应用,还是Compartor实用性更大。
我们先来一个程序需求
对于这种数据,我的第一想法是Collection.sort()直接将List扔进去,然后再reverse()进行倒转,然后我就试了一下。
然而并不可以,直接编译不通过。
然后在网上进行查找资料,如何对于泛型对象数据实现倒叙呢?
给出的答案就是,重写compare。
对于这部分代码我可以参考这位大佬,使用这部分重写,确实可以做到倒叙排序,起初我还很开心,但是对于返回值为啥是O2的数据-O1的数据呢,让我产生不小的疑问。
返回值含义
对于这个问题,我查了很久,终于明白了其中的道理。
理解方式就是:
- return 0:不交换位置,不排序
- return 1:交换位置
- return -1:不交换位置
- return o1-o2:升序排列
- return o2-o1:降序排列
前面的数>后面的数,是降序(从大到小)排列,如果想要改为升序排列,就需要返回1
前面的数<后面的数,是升序(从小到大)排列,不改变位置就返回-1
二者相等,不进行交换,也就不排序。
总结来说,compare其中的规则就是以上所叙述的,大家其实不用在意这个减号,其实可以理解为从O1到O2,O2到O1。后面的数大于前面的,也就是所说的升序,前面大于后面,也就是所谓的将于,稍微抽象理解一下。或者理解参数的位置,O2在前就是降序,O2在后就是升序,其中O2大于O1,其中的顺序就自然而然的显现出来了。
总结
通过一路的梳理,对于Collection中排序应该没有什么太大问题了,而且这个Compare对于项目中用到的地方还是很多的,一定要掌握差不多,受益很大。我也是程序员小白,不断的摸索,不断的去研究,一些该掌握的还是需要深入研究的。如果其中存在什么问题,欢迎指出,不断的更新,不断的才是进步。
end
程序员小C