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区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot 自定义校验代码实例

    Springboot 自定义校验代码实例

    这篇文章主要介绍了Springboot 自定义校验代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java设计模式中的策略模式详细解析

    Java设计模式中的策略模式详细解析

    这篇文章主要介绍了Java设计模式中的策略模式详细解析,所谓策略模式,指的是做某一件事时有多种选择(即策略),且不同的策略之间相互独立,而且无论使用哪种策略,得到的结果都是相同的,需要的朋友可以参考下
    2023-12-12
  • java字符转码的三种方法总结及实例

    java字符转码的三种方法总结及实例

    这篇文章主要介绍了 java字符转码的三种方法总结及实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • JAVA实现汉字转拼音功能代码实例

    JAVA实现汉字转拼音功能代码实例

    这篇文章主要介绍了JAVA实现汉字转拼音功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java泛化调用实现原理解析

    Java泛化调用实现原理解析

    泛化调用指的是不依赖服务接口的本地 stub 或代理类,通过统一的参数结构动态调用远程服务方法,本文介绍Java泛化调用实现原理解析,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java实现二分法变种的示例代码

    Java实现二分法变种的示例代码

    这篇文章主要为大家介绍了Java实现二分法变种的示例代码复,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • spring @Scheduled注解的使用误区及解决

    spring @Scheduled注解的使用误区及解决

    这篇文章主要介绍了spring @Scheduled注解的使用误区及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Springboot中的Shiro基础入门教程

    Springboot中的Shiro基础入门教程

    Apache Shiro是一个强大且灵活的开源安全框架,适用于Java应用程序,它提供了认证、授权、会话管理和加密等功能,通过Shiro,开发者可以轻松地实现用户身份验证和权限控制,从而保护应用程序的安全,本文介绍Springboot中的Shiro基础入门教程,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 利用ScriptEngineManager实现字符串公式灵活计算的方法

    利用ScriptEngineManager实现字符串公式灵活计算的方法

    今天小编就为大家分享一篇利用ScriptEngineManager实现字符串公式灵活计算的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 详解springmvc控制登录用户session失效后跳转登录页面

    详解springmvc控制登录用户session失效后跳转登录页面

    本篇文章主要介绍了springmvc控制登录用户session失效后跳转登录页面,session一旦失效就需要重新登陆,有兴趣的同学可以了解一下。
    2017-01-01

最新评论