Comparable 和 Comparator的理解

简介: Comparable是一个排序接口 此接口给实现类提供了一个排序的方法,此接口有且只有一个方法

对Comparable 的解释

Comparable是一个排序接口

此接口给实现类提供了一个排序的方法,此接口有且只有一个方法

public int compareTo(T o);

compareTo方法接受任意类型的参数,来进行比较

list或者数组实现了这个接口能够自动的进行排序,相关类的方法有Collections.sort(),Arrays.sort();

SortedMap 接口的key内置了compareTo方法来进行键排序,SortedSet 也是内置了compareTo方法作为其内部元素的比较手段

compareTo()方法与equals()方法的比较

compareTo()方法不同于equals()方法,它的返回值是一个int类型

int a = 10 , b = 20 , c = 30 , d = 30;

a.compareTo(b) // 返回 -1 说明 a 要比 b 小
c.compareTo(b) // 返回 1 说明 c 要比 b 大
d.compareTo(c) // 返回 0 说明 d 和c 相等

而equals 方法返回的是boolean 类型

x.equals(y) // true 说明x 与 y 的值 相等 , false 说明x 与 y 的值 不相等

代码

Comparable 更像是一个内部排序接口,一个类实现了Comparable比较器,就意味着它本身支持排序;可以用Collections.sort() 或者 Arrays.sort() 进行排序

public class Student implements Comparable<Student>{

String name;
int record;

public Student(){}
public Student(String name,int record){
this.name=name;
this.record=record;
}

public boolean equals(Student student) {
// 拿名字和成绩进行对比
return name.equals(student.name)
&&record == student.record;
}

@Override
public int compareTo(Studentstu) {
// 调用String 类的compareTo方法,返回值 -1,0,1
return this.name.compareTo(stu.name);
}

get and set...
}


public class ComparableTest{

public static void main(String[] args) {
List<Student> studentList = Arrays.asList(new Student("liming", 90),
new Student("xiaohong", 95),
new Student("zhoubin", 88),
new Student("xiaoli", 94)
);
// 排序前
System.out.println(studentList);
Collections.sort(studentList);
// 排序后
System.out.println(studentList);

for(Student student : studentList){
System.out.println(student.equals(new Student("xiaohong", 95)));
}
}
}

输出:

liming = 90, xiaohong = 95, zhoubin = 88, xiaoli = 94

false true false false

compareTo()方法抛出异常

public int compareTo(To);

NullPointerException : 如果 对象o为null,抛出空指针异常

ClassCastException: 如果需要类型转换之后进行比较,可能会抛出ClassCastException


对Comparator 的解释

Comparator 相当于一个比较器,作用和Comparable类似,也是使用Collections.sort() 和 Arrays.sort()来进行排序,也可以对SortedMap 和 SortedSet 的数据结构进行精准的控制,你可以不用实现此接口或者Comparable接口就可以实现次序比较。 TreeSet 和 TreeMap的数据结构底层也是使用Comparator 来实现。不同于Comparable ,比较器可以任选地允许比较null参数,同时保持要求等价关系。

Comparator比较器的方法

int compare(T o1, T o2);

compare() 方法的用法和Comparable 的 compareTo() 用法基本一样,这个方法不允许进行null值比较,会抛出空指针异常

boolean equals(Object obj);

jdk1.8 之后又增加了很多新的方法

33.jpg

很多都是关于函数式编程的,在这里先不做讨论了

代码实现

public class AscComparator implements Comparator<Student>{

@Override
public int compare(Student stu1, Student stu2) {

// 根据成绩降序排列
return stu1.getRecord() - stu2.getRecord();
}

}

public class ComparatorTest{

public static void main(String[] args) {
List<Student> studentList = Arrays.asList(new Student("liming", 90),
new Student("xiaohong", 95),
new Student("zhoubin", 88),
new Student("xiaoli", 94)
);
// 1. 可以实现自己的外部接口进行排序
Collections.sort(studentList,new AscComparator());

System.out.println(studentList);

// 2、 可以匿名内部类实现自定义排序
Collections.sort(studentList, new Comparator<Student>() {
@Override
public int compare(Student stu1, Student stu2) {
return stu2.getRecord() -stu1.getRecord();
}
});
System.out.println(studentList);
}
}

也可以使用Arrays.sort()进行排序,不过针对的数据结构是数组。


Comparable 和 Comparator 的对比

1、Comparable 更像是自然排序

2、Comparator 更像是定制排序

同时存在时采用 Comparator(定制排序)的规则进行比较。

对于一些普通的数据类型(比如 String, Integer, Double…),它们默认实现了Comparable 接口,实现了 compareTo 方法,我们可以直接使用。

而对于一些自定义类,它们可能在不同情况下需要实现不同的比较策略,我们可以新创建 Comparator 接口,然后使用特定的 Comparator 实现进行比较。

            </div>
目录
相关文章
|
人工智能 vr&ar 图形学
开源单图生成3D模型TripoSR的局限性分析
【2月更文挑战第25天】开源单图生成3D模型TripoSR的局限性分析
675 6
开源单图生成3D模型TripoSR的局限性分析
|
9月前
2024阿里云技术年报 基础设施篇
2024阿里云技术年报基础设施篇
299 14
2024阿里云技术年报 基础设施篇
|
人工智能 API 开发工具
ChatGPT 人工智能助理 Assistant
Assistants API 让你构建定制化的AI助手,通过指令引导助手运用模型、工具和知识回应查询。核心模块包括名称、指令、模型选择(如GPT-4)、工具(如Code Interpreter)及知识检索。需注意,免费账户限制较多,建议使用付费账户以获得完整体验。可通过界面操作或Python SDK实现助手创建、线程管理及信息交互等功能。相关资源包括官方文档和体验平台。
|
JavaScript 前端开发 开发者
jQuery 下载与快速入门指南
jQuery 下载与快速入门指南
707 0
|
Linux
linux-du指令
`du`命令是Linux系统中查看磁盘使用情况的基本工具之一。通过灵活使用 `du`命令的各种选项,可以准确、高效地获取文件和目录的大小信息,有助于系统管理员进行磁盘空间管理。无论是查找大文件、分析目录结构还是排除特定类型的文件,`du`命令都提供了丰富的功能和灵活的配置。理解和掌握 `du`命令的使用,对于维护和优化Linux系统的磁盘空间至关重要。
472 4
|
机器学习/深度学习
【机器学习】贝叶斯统计中,“似然”和“后验概率”有什么区别?
【5月更文挑战第11天】【机器学习】贝叶斯统计中,“似然”和“后验概率”有什么区别?
|
XML 前端开发 Java
《手把手教你》系列技巧篇(十六)-java+ selenium自动化测试-元素定位大法之By xpath下卷(详细教程)
【4月更文挑战第8天】本文介绍了WebDriver中的一种元素定位方法:By xpath。XPath是一种在XML文档中查找信息的语言,由于HTML文档是XML的子集,所以可以使用XPath来定位网页上的元素。XPath定位方法非常强大,几乎可以定位到页面上的任何元素。然而,由于它需要扫描整个页面来找到匹配的元素,所以定位速度相对较慢。
260 0
|
数据安全/隐私保护
Mac 免费远程连接工具Parallels Client
Mac 免费远程连接工具Parallels Client
427 0
|
XML 传感器 Java
Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife
最近发现这个项目好似迎来了第二春,GitHub上的Start和Fork增加的很快,我的猜测是学生在通过这个项目来学习和完成自己的作业。随着Android版本的更新,Android Studio的更新,项目中一些内容不能在新版本中很好的使用,甚至出现编译不了的情况,这对我来说没啥,但是对于拿到项目满心欢喜的学生来说,运行不了,无疑是致命的,而我写在项目Readme下面我将演示一下怎么在本地运行这个项目的代码。
671 1
Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife
|
算法 测试技术 区块链
usdt合约交易规则分析|usdt合约交易功能开发部署解析
usdt合约交易规则是由各大交易平台制定和实施的,不同的平台可能会有一些细微的差异。一般来说,以下是一些常见的usdt合约交易规则: