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

相关文章

  • Mybatis中的高级映射一对一、一对多、多对多

    Mybatis中的高级映射一对一、一对多、多对多

    这篇文章主要介绍了Mybatis中的高级映射一对一、一对多、多对多的相关资料,需要的朋友可以参考下
    2016-08-08
  • Java手写一个日志框架的示例代码

    Java手写一个日志框架的示例代码

    日志框架是一种用于记录和管理应用程序运行时信息的软件组件,它通常提供了一套API让开发人员能够在代码中插入日志语句,下面我们就来学习一下如何手写一个日志框架吧
    2023-12-12
  • mybatis group by substr函数传参报错的解决

    mybatis group by substr函数传参报错的解决

    这篇文章主要介绍了mybatis group by substr函数传参报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 简单谈谈Spring Ioc原理解析

    简单谈谈Spring Ioc原理解析

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。
    2018-09-09
  • 基于OpenCv与JVM实现加载保存图像功能(JAVA 图像处理)

    基于OpenCv与JVM实现加载保存图像功能(JAVA 图像处理)

    openCv有一个名imread的简单函数,用于从文件中读取图像,本文给大家介绍JAVA 图像处理基于OpenCv与JVM实现加载保存图像功能,感兴趣的朋友一起看看吧
    2022-01-01
  • mybatis if传入字符串数字踩坑记录及解决

    mybatis if传入字符串数字踩坑记录及解决

    这篇文章主要介绍了mybatis if传入字符串数字踩坑记录及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 谈谈Java中自定义注解及使用场景

    谈谈Java中自定义注解及使用场景

    这篇文章主要介绍了谈谈Java中自定义注解及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 浅谈JAVASE单例设计模式

    浅谈JAVASE单例设计模式

    整理笔记的时候发现以前写的单利设计模式的文章,贴出来给大家分享下!有需要的小伙伴可以来参考下
    2015-11-11
  • SpringBoot给类进行赋初值的四种方式

    SpringBoot给类进行赋初值的四种方式

    这篇文章主要介绍了springboot给类进行赋初值的四种方式,并通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-08-08
  • Java实现手写一个线程池的示例代码

    Java实现手写一个线程池的示例代码

    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和细节吗?本文就来通过手写一个简单的线程池框架,去掌握线程池的基本原理,感兴趣的可以学习一下
    2022-10-10

最新评论