当前位置: 首页 > news >正文

Java中的Comparator 与 Comparable详解

Comparator VS Comparable

  • 1. Comparator
    • 1.1 对一维数组进行排序
    • 1.2 对二维数组进行排序
    • 1.3 对对象数组进行排序
  • 2. Comparable
  • 3. 二者区别

1. Comparator

通过源码发现Comparator是一个接口。

在这里插入图片描述

根据compare方法中的注释可以发现方法返回三种类型的值,正数、零、负数,分别对应 小于,等于,大于。

1:前面的数 > 后面的数,是降序(从大到小)的,如果想要改为升序排列,就需要返回 1;
-1:前面的数 < 后面的数,是升序(从小到大)的,不改变位置就返回 -1;
0:二者相等,不进行交换,也就不排序。但是要根据题目来判断返回什么。如果数组是无序的,不能直接返回0。
若保证升序排列,要返回o1 - o2,降序则 o2 - o1。( o1值的是集合中的第一个对象,o2是第二个对象)
return 0:不交换位置,不排序
return 1:交换位置
return -1:不交换位置

下面将对Comparator接口的用法进行讲解:

  1. 对一维数组进行排序。
  2. 对二维数组进行排序。
  3. 对对象数组进行排序。

1.1 对一维数组进行排序

使用Arrays类中的sort方法直接对ages进行排序,默认排序方式为升序。

在这里插入图片描述

使用匿名内部类对数据这里要求数组不能为基本类型的素组,可以转化为基本数据类型对应的包装类进行降序排列:

    return o1 - o2; -- 升序排列return o2 - o1; -- 降序排列

在这里插入图片描述

1.2 对二维数组进行排序

使用Arrays类中的sort方法,如下所示:

在这里插入图片描述

在这里插入图片描述

1.3 对对象数组进行排序

创建Student学生实体类:

public class Student {private int age;private String name;private double height;// setXXX/getXXX,构造方法,toString方法
}

直接对Strudent数据进行排序:可以发现对实体类数组直接进行排序会报错。

在这里插入图片描述

结合ComparatorStrudent数组按照年龄从低到高进行排序:

在这里插入图片描述

结合ComparatorStrudent数组按照身高从高到底进行排序:

在这里插入图片描述

2. Comparable

使用场景:假如说我们有这样一个需求,需要设计一个Student类,有两个属性:姓名(name)、年龄(age)和身高(height),按照年龄的大小进行排序,那么就可以使用Comparable进行实现,注意区别Comparator

  1. 首先创建Student类并实现Comparable<T>接口, 按照年龄升序排列Comparator<T>,其中泛型T为比较器可以比较的对象的类型,在这里面为Person

在这里插入图片描述

  1. 首先创建Student类并实现Comparable<T>接口, 按照年龄降序排列

在这里插入图片描述

  1. 首先创建Student类并实现Comparable<T>接口, 按照身高升序排列

在这里插入图片描述

  1. 首先创建Student类并实现Comparable<T>接口, 按照身高降序排列

在这里插入图片描述

3. 二者区别

Comparable 和 Comparator 的区别

  1. java.lang.Comparable:在类定义的时候,可以实现好的接口,里面有compareTo这个方法需要实现。
  2. java.util.Comparator:是挽救的比较接口(假如我们需要对别人给Person类进行排序,但是Person类里面没有Comparable接口,如果在不允许改变源代码的情况下,我们就可以使用Comparator接口),需要单独定义一个比较类,里面有compare比较方法。
http://www.lryc.cn/news/30559.html

相关文章:

  • 计算机科学导论笔记(二)
  • GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音
  • 如何判断树莓派通过GPIO与5G模块成功连接?
  • Java——包装类和List及ArrayList
  • matlab - 程序流程控制、函数文件、特殊函数、调试与优化
  • Toponogov 比较定理及其应用
  • 力扣sql简单篇练习(二十二)
  • 【开源硬件】STM32F030R8T6系统板
  • ES之DSL查询文档基础查询
  • 数据结构与算法之堆排序
  • Vue3 中的模板语法
  • Redis十大类型——Hash常见操作
  • Python采集本地二手房,一键知晓上万房源信息
  • Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法(亲测有效)
  • Java文档搜索引擎总结
  • Linux内核学习笔记——页表的那些事。
  • C++,Qt分别读写xml文件
  • WebStorm安装教程【2023年最新版图解】一文教会你安装
  • 用户态和内核态,系统调用
  • Java 包装类
  • Raspberry Pi GPIO入门指南
  • 汇编语言程序设计(三)之汇编程序
  • 用二极管和电容过滤电源波动,实现简单的稳压 - 小水泵升压改装方案
  • 【数据结构与算法】数据结构有哪些?算法有哪些?
  • 使用Element-UI展示数据(动态查询)
  • lamda 表达式例子全集
  • 计算机网络第八版——第一章课后题答案(超详细)
  • 嵌入式和Python(二):python初识及其基本使用规则
  • C语言详解双向链表的基本操作
  • 面试必须要知道的常见排序算法