时间:2021-05-19
本文实例讲述了Java比较器实现方法。分享给大家供大家参考,具体如下:
1 需求
一个项目,展示监控数据列表,数据来源于接口,不需要分页,目前可时长排序:
客户希望可先对【状态】分组,然后再对【时长】排序。
2 分析
考虑以下方案:
①.编写 js 脚本,在前端做分组排序。
②.利用 Java 比较器,在后端做分组排序,前端直接渲染即可。
比较后发现使用 Java 比较器实现,更方便些。
3 Java 比较器
Java 中有两种比较器的实现方式:Comparable(内部比较器) 与 Comparator(外部比较器)。
3.1 Comparable 接口
代码模板:
public class Entity implements Comparable<Entity> { @Override public int compareTo(Entity o) { return 0; }}Comparable 接口支持泛型参数,所以一个需要比较实体类只需要按照上面的代码模板实现 Comparable 接口,即可对传入的另一个同类型的实体类进行比较啦。
因为比较方法是定义在实体类中,所以把它叫做内部比较器。
3.2 Comparator 接口
代码模板:
public class EntityComparator implements Comparator<Entity> { @Override public int compare(Entity o1, Entity o2) { return 0; }}Comparator 接口同样也支持泛型参数。不同的是它是一个比较器类,所以叫它外部比较器。比较器类使用更灵活,我们可以定义多个比较器类用于不同的排序场景。
4 实战
因为业务场景需要先对【状态】分组排序后,然后再对【时长】排序,而【时长】的排序又可分为正序与逆序两种,所以我们采用 Java 外部比较器来实现该业务逻辑。
待比较的实体类:
public class Record { //状态 private String state; //时长 private String time; public Record(String state, String time) { this.state = state; this.time = time; } public String getState() { return state; } public String getTime() { return time; } @Override public String toString() { return "Record{" + "state='" + state + '\'' + ", time='" + time + '\'' + '}'; }}比较器 A:先对【状态】排序,然后再对【时长】按正序排序
public class RecordComparator implements Comparator<Record> { @Override public int compare(Record o1, Record o2) { final int stateCompare = o1.getState().compareTo(o2.getState()); if (stateCompare == 0) { return o1.getTime().compareTo(o2.getTime()); } return stateCompare; }}比较器 B:先对【状态】排序,然后再对【时长】按逆序(倒序)排序
public class RecordTimeDescComparator implements Comparator<Record> { @Override public int compare(Record o1, Record o2) { final int stateCompare = o1.getState().compareTo(o2.getState()); if (stateCompare == 0) { return o2.getTime().compareTo(o1.getTime()); } return stateCompare; }}单元测试:
Record record1 = new Record("通话中", "00:01:08");Record record2 = new Record("空闲", "00:18:02");Record record3 = new Record("通话中", "00:04:04");Record record4 = new Record("空闲", "00:01:57");List<Record> recordList = new ArrayList<>();recordList.add(record1);recordList.add(record2);recordList.add(record3);recordList.add(record4);System.out.println("排序前:" + recordList);Collections.sort(recordList, new RecordComparator());System.out.println("排序后【时间正序】:" + recordList);recordList = new ArrayList<>();recordList.add(record1);recordList.add(record2);recordList.add(record3);recordList.add(record4);System.out.println("排序前:" + recordList);Collections.sort(recordList, new RecordTimeDescComparator());System.out.println("排序后【时间倒序】:" + recordList);输出结果:
排序前:[Record{state='通话中', time='00:01:08'}, Record{state='空闲', time='00:18:02'}, Record{state='通话中', time='00:04:04'}, Record{state='空闲', time='00:01:57'}]
排序后【时间正序】:[Record{state='空闲', time='00:01:57'}, Record{state='空闲', time='00:18:02'}, Record{state='通话中', time='00:01:08'}, Record{state='通话中', time='00:04:04'}]
排序前:[Record{state='通话中', time='00:01:08'}, Record{state='空闲', time='00:18:02'}, Record{state='通话中', time='00:04:04'}, Record{state='空闲', time='00:01:57'}]
排序后【时间倒序】:[Record{state='空闲', time='00:18:02'}, Record{state='空闲', time='00:01:57'}, Record{state='通话中', time='00:04:04'}, Record{state='通话中', time='00:01:08'}]
通过 Java 比较器就可以把看似复杂的问题解决啦O(∩_∩)O哈哈~
PS:这里再为大家推荐一款关于排序的演示工具供大家参考:
在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具:
http://tools.jb51.net/aideddesign/paixu_ys
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java使用agent实现main方法之前的实例详解创建Agent项目PreMainExecutor类,在main方法之前执行此方法publicclassPre
一个简单的Javaweb服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现;一、程序执行步骤1.创建一个S
本文实例讲述了Android电话拨号器实现方法。分享给大家供大家参考。具体如下:以下案例模拟android电话拨号器的实现AndroidManifest.xml
java读取resources文件详解及实现代码Java项目中,经常需要将资源文件打包放在项目中,然后在项目中去读取对应的文件。实现代码:Stringstr=R
wangEditor是基于javascript和css开发的Web富文本编辑器,轻量、简洁、易用、开源免费。在我们实际项目上还是比较频繁应用到的,下面出个案例供