自定义排序实现
假设现有如下需求排序,
*对于每个事件(一条记录),有xxx1,xxx2, 处理状态,用户反馈状态,创建时间等关键信息。现希望按提交状态,评价状态,创建时间这几个要素排序 ,规则如下
1.提交状态(已提交,填写中,未提交;升序),
2.按评价状态(已评价,未评价; 升序)
3.按创建时间,降序
因排序字段涉及到字符串,只能考虑自行排序。
我们可以考虑实现java.util.Comparable接口,使得对象可以被排序,也可考虑直接实现一个java.util.Comparator来自定义一个比较器。
鉴于使用实现比较器的方式可以在其他同类需求的地方直接使用该比较器,引用方便,而不是直接实现对象的Comparable的接口(因多个PO均有该排序需求)
下面通过构建一个简单的实体和一个 比较器来实现该需求。
实现过程
-
为了方便使用,直接构建一个三元组PO来封装需要排序的一个事件记录对象。
如下:
*三元组类(Triple.java). 用于封装此次需求的排序的三个要素。
-
自定义排序器实现,下面为了代码简单,直接静态类来写在Main方法所在类了(为了比较器看上去简洁,不使用拉姆达表达式来定义比较器)。
附: 比较器原理
java.util.Comparator接口 (接口返回值为int数字 )中排序规则,其中 ,若有两个对象Object a,Object b,调用比较器 a.compare(b)
,
返回正数,代表a大于b;返回0表示相等,返回负数,表示a小于b。
升序或降序排序可以理解如下:
假如A的值大于B,返回正数,此时调用该比较器是升序;假如A的值大于B,你返回-1,此时调用该比较器函数就是降序。当然,也可以调换位置来使得排序反转(b.compare(a))
3.为了字符串的排序更加直观,增加字符串与可比较类型
注: (?如图中采取了字符串与数字类型映射) 映射,此处的可比较类型当然也可以是另一个字符串(因字符串也是可比较的,默认按字符串长度,此处自定义是因为 提交状态和评价状态都是三个字的,必须自定义新的规则返回不同的int数来实现排序)
3. 自定义比较器的使用及检验
如下,制造一些数据来校验排序是否有效。
结果如下,
可看到,实现了当前业务的排序需求。