java学习笔记——Comparator和Comparable
2021/4/12 20:29:50
本文主要是介绍java学习笔记——Comparator和Comparable,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
- Comparable
- Comparator
- 注意
Comparable
Comparable
是排序接口- 如果一个类实现了
Comparable
接口,就说明该类支持排序。此外,实现Comparable接口的类的对象可以用作有序映射(如TreeMap)中的键或有序集合中的元素,而不需要指定比较器。 Comparable
接口所定义的顺序,叫做natural ordering。当向支持排序的集合中添加该类元素后,在对该集合排序时,就会调用comparaTo方法来进行natural ordering进行排序。- 接口中通过
x.comparaTo(y)
来比较x和y的大小。若返回负数,说明x<y;返回正数,说明x>y;返回0,说明x=y。 - 列如在赫夫曼树的建立中,就需要对树的节点类实现
Comparable
接口
//由于赫夫曼树需要对数的根节点排序,因此需要实现comparable接口,就能直接使用Collection.sort方法了 public class Node implements Comparable<Node>{ public int val; public Node left; public Node right; public Node(int val) { this.val = val; } @Override public String toString() { return "Node{" + "val=" + val + '}'; } @Override public int compareTo(Node o) { return this.val - o.val; //this-o为从小到大排序,反过来为从大到小 } }
Comparator
Comparator
是比较器接口- 该接口的作用是用来辅助排序的。在上文中,我们说了
Comparable
接口指定了对象的natural ordering,但是如果我们想在排序时按照我们自定义的方式进行排序,这个时候就需要用到Comparator
接口了。 Collections.sort(List,Comparator)
,Arrays.sort(Object[],Comparator)
等这些辅助的方法类都可以通过传入一个Comparator来自定义排序规则。在排序过程中,首先会去检查Comparator是否存在,如果不存在则会使用默认的natural ordering。int compare(T o1, T o2)
和上面的x.comparaTo(y)
类似,定义排序规则后,返回正数、负数和0,分别代表大于、小于和等于。- 比如,对一个
Integer
类型的数组的排序方式进行重写,使其在sort后按降序排列
public class Test { public static void main(String[] args) { Integer[] a = {3,2,7,4,0,6,5}; Arrays.sort(a); System.out.print("重写前:"); System.out.println(Arrays.toString(a)); Arrays.sort(a, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; } }); System.out.print("重写后:"); System.out.println(Arrays.toString(a)); } }
重写前:[0, 2, 3, 4, 5, 6, 7] 重写后:[7, 6, 5, 4, 3, 2, 0]
注意
Comparator
允许对null参数的比较,而Comparable
是不允许的,否则会爬出NullPointerException
。Comparator
不支持对int
、double
等基本数据类型的排序方法进行重写
这篇关于java学习笔记——Comparator和Comparable的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)