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

 更新时间:2019年03月05日 14:23:29   作者:deniro_li  
这篇文章主要介绍了Java比较器实现方法,结合具体项目案例形式分析了Java比较器相关排序操作技巧,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • Spring集成Druid连接池及监控配置的全过程

    Spring集成Druid连接池及监控配置的全过程

    java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池,下面这篇文章主要给大家介绍了关于Spring集成Druid连接池及监控配置的相关资料,需要的朋友可以参考下
    2021-09-09
  • 如何利用grep-console插件使Intellij idea显示多颜色调试日志

    如何利用grep-console插件使Intellij idea显示多颜色调试日志

    这篇文章主要介绍了利用grep-console插件使Intellij idea显示多颜色调试日志,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Java多线程定时器Timer原理及实现

    Java多线程定时器Timer原理及实现

    这篇文章主要介绍了Java多线程定时器Timer原理及实现,涉及Timer的schedule的使用,定时器Timer的schedule等相关内容以及代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 深度解析Java中的国际化底层类ResourceBundle

    深度解析Java中的国际化底层类ResourceBundle

    做项目应该都会实现国际化,那么大家知道Java底层是如何实现国际化的吗?这篇文章就来和大家深度解析一下Java中的国际化底层类ResourceBundle,希望对大家有所帮助
    2023-03-03
  • SpringBoot外部化配置示例解析

    SpringBoot外部化配置示例解析

    这篇文章主要介绍了SpringBoot外部化配置示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Springboot创建项目的图文教程(idea版本)

    Springboot创建项目的图文教程(idea版本)

    这篇文章主要介绍了Springboot创建项目的图文教程(idea版本),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • GitLab+Jenkins+Maven+Tomcat 实现自动集成、打包、部署

    GitLab+Jenkins+Maven+Tomcat 实现自动集成、打包、部署

    本文主要介绍了GitLab + Jenkins + Maven + Tomcat 实现自动集成、打包、部署,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java设计模式之抽象工厂模式详解

    Java设计模式之抽象工厂模式详解

    这篇文章主要介绍了Java设计模式之抽象工厂模式详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • 详解SpringMVC拦截器(资源和权限管理)

    详解SpringMVC拦截器(资源和权限管理)

    本篇文章主要介绍了SpringMVC拦截器(资源和权限管理),具有一定的参考价值,有兴趣的可以了解一下。
    2016-12-12
  • 解析springboot集成AOP实现日志输出的方法

    解析springboot集成AOP实现日志输出的方法

    如果这需要在每一个controller层去写的话代码过于重复,于是就使用AOP定义切面 对其接口调用前后进行拦截日志输出。接下来通过本文给大家介绍springboot集成AOP实现日志输出,需要的朋友可以参考下
    2021-11-11

最新评论