Java中Comparator与Comparable排序的区别详解

 更新时间:2024年01月17日 11:24:22   作者:霸道流氓气质  
这篇文章主要介绍了Java中Comparator与Comparable排序的区别详解,如果你有一个类,希望支持同类型的自定义比较策略,可以实现接口Comparable,如果某个类,没有实现Comparable,但是又希望对它进行比较,则可以自定义一个Comparator,需要的朋友可以参考下

场景

java中进行排序比较时Comparator与Comparable区别:

如果你有一个类,希望支持同类型的自定义比较策略,可以实现接口Comparable

如果某个类,没有实现Comparable,但是又希望对它进行比较,则可以自定义一个Comparator,来定义这个类的比较规则

使用Comparable进行排序比较

新建类CompareDemo,并添加code和age属性,该类实现Comparable接口

并重新compareTo方法

public class CompareDemo implements Comparable<CompareDemo>{
    int code;
    int age;
    public CompareDemo(int code, int age) {
        this.code = code;
        this.age = age;
    }
    @Override
    public int compareTo(CompareDemo o) {
        if(code == o.code){
            return 0;
        }else if(code<o.code){
            return -1;
        }else{
            return 0;
        }
    }
}

进行排序比较,默认根据code进行升序比较

List<CompareDemo> list = new ArrayList<CompareDemo>(){{
    add(new CompareDemo(10,20));
    add(new CompareDemo(12,30));
    add(new CompareDemo(11,10));
}};
list.forEach(compareDemo -> System.out.println(compareDemo.code));
//默认根据code进行升序比较
list.sort(null);
list.forEach(compareDemo -> System.out.println(compareDemo.code));

如果现在需求变了,希望针对age字段,进行升序排序,那么就可以利用Comparator实现。

使用Comparator进行排序

list.sort(new Comparator<CompareDemo>() {
    @Override
    public int compare(CompareDemo o1, CompareDemo o2) {
        if (o1.age == o2.age) {
            return 0;
        } else if (o1.age < o2.age) {
            return -1;
        } else {
            return 1;
        }
    }
});
list.forEach(compareDemo -> System.out.println(compareDemo.age));

上面的排序可以简化为

list.sort(new Comparator<CompareDemo>() {
    @Override
    public int compare(CompareDemo o1, CompareDemo o2) {
        return Integer.compare(o1.age,o2.age);
    }
});

在JDK1.8中还可以更简化

list.sort(Comparator.comparingInt(o -> o.age));

如果希望倒序

list.sort(new Comparator<CompareDemo>() {
    @Override
    public int compare(CompareDemo o1, CompareDemo o2) {
        return Integer.compare(o2.age,o1.age);
    }
});

在jdk1.8中,使用负数

list.sort(Comparator.comparingInt(o->-o.age));
list.forEach(compareDemo -> System.out.println(compareDemo.age));

到此这篇关于Java中Comparator与Comparable排序的区别详解的文章就介绍到这了,更多相关Comparator与Comparable区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud整合Activiti过程中的踩坑记录

    SpringCloud整合Activiti过程中的踩坑记录

    由于项目需要,最近开始在项目Spring boot中集成工作流引擎Activiti,由于第一次集成,一路上步步都是坑,所以这篇文章主要给大家介绍了关于SpringCloud整合Activiti过程中所遇到的踩坑记录,需要的朋友可以参考下
    2021-09-09
  • NameNode 重启恢复数据的流程详解

    NameNode 重启恢复数据的流程详解

    这篇文章主要为大家介绍了NameNode 重启恢复数据的流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Nacos配置中心设计原理分析

    Nacos配置中心设计原理分析

    今天分享一下Nacos配置变更的相关知识点,现在使用Java生态如果使用微服务,如果部署在K8s上,那么可能会使用ConfigMap来存储配置文件,如果没有使用K8s,那么基本上都使用Nacos来做配置中心,所以有必要了解一下Nacos的配置的知识点,本文只是对其中的部分实现原理进行分析
    2023-10-10
  • 基于Failed to load ApplicationContext异常的解决思路

    基于Failed to load ApplicationContext异常的解决思路

    这篇文章主要介绍了基于Failed to load ApplicationContext异常的解决思路,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • MyBatis-Plus如何解决主键自增问题

    MyBatis-Plus如何解决主键自增问题

    这篇文章主要介绍了MyBatis-Plus如何解决主键自增问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringMVC视图作用详解

    SpringMVC视图作用详解

    这篇文章主要介绍了springMVC中的视图与视图解析器,springMVC视图的种类很多,默认有转发视图和重定向视图,本文就每一种视图给大家详细介绍,需要的朋友可以参考下
    2022-11-11
  • 详解MyBatis-Puls中saveBatch批量添加慢的问题

    详解MyBatis-Puls中saveBatch批量添加慢的问题

    本文主要介绍了详解MyBatis-Puls中saveBatch批量添加慢的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 详解SpringBoot自定义配置与整合Druid

    详解SpringBoot自定义配置与整合Druid

    Druid是alibaba开源平台上一个数据库连接池实现,结合了C3P0,DBCP等DB池的优点,同时也有Web监控界面。这篇文章主要介绍了Java之SpringBoot自定义配置与整合Druid的相关知识,需要的朋友可以参考下
    2021-09-09
  • 在SpringBoot中添加Redis及配置方法

    在SpringBoot中添加Redis及配置方法

    这篇文章主要介绍了在SpringBoot中添加Redis及配置redis的代码,需要的朋友可以参考下
    2018-10-10
  • Spring boot中自定义Json参数解析器的方法

    Spring boot中自定义Json参数解析器的方法

    这篇文章主要介绍了Spring boot中自定义Json参数解析器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01

最新评论