温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用Java怎么实现一个比较器

发布时间:2021-04-20 17:08:34 来源:亿速云 阅读:157 作者:Leah 栏目:编程语言

使用Java怎么实现一个比较器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Java的特点有哪些

Java的特点有哪些 1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 2.Java具有简单性、面向对象、分布式、安全性、平台独立与可移植性、动态性等特点。 3.使用Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

 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怎么实现一个比较器的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI