评论

收藏

[Java] Java比较器实现方法项目案例

编程语言 编程语言 发布于:2021-09-18 15:28 | 阅读数:304 | 评论:0

这篇文章主要介绍了Java比较器实现方法,结合具体项目案例形式分析了Java比较器相关排序操作技巧,需要的朋友可以参考下
本文实例讲述了java比较器实现方法。分享给大家供大家参考,具体如下:
1 需求
一个项目,展示监控数据列表,数据来源于接口,不需要分页,目前可时长排序:
DSC0000.png

客户希望可先对【状态】分组,然后再对【时长】排序。
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(&cap;_&cap;)o哈哈~
希望本文所述对大家java程序设计有所帮助。
原文链接:https://blog.csdn.net/deniro_li/article/details/81698954

关注下面的标签,发现更多相似文章