Comparator接口的compare方法详解:参数、返回值及应用场景
创作时间:
作者:
@小白创作中心
Comparator接口的compare方法详解:参数、返回值及应用场景
引用
CSDN
1.
https://blog.csdn.net/yngzh/article/details/145261663
Comparator类是一个被@FunctionalInterface标注的函数式接口,通常只需实现其int compare(T o1, T o2)方法。本文将详细介绍Comparator接口的compare方法的使用和理解,包括其参数和返回值的意义,并通过具体的代码示例展示如何使用Comparator对集合进行排序。
一. 前言
Comparator类是一个被@FunctionalInterface标注的函数式接口, 故通常状况下只需实现其int compare(T o1, T o2)方法, 且通常以匿名内部类或lambda的形式出现, 常见的应用场景如:
- 集合排序:
list.sort(Comparator<? super E> c)
list.stream().sorted(Comparator<? super T> comparator)
Collections.sort(List<T> list, Comparator<? super T> c)
- 创建有序集合:
new TreeSet<>(Comparator<? super E> comparator)
new TreeMap<>(Comparator<? super K> comparator)
二. 如何根据 int compare(T o1, T o2) 方法的返回值进行排序?
先看jdk中对于该方法参数及返回值的注释说明:
如果直译的话可能不太容易理解甚至容易给人造成困惑, 故可以将其以一种更容易接受的方式进行同等表述, 即理解方式一:
- 参数o1代表前面一个元素, o2代表后面一个元素.
- 当该方法返回负数值时, 代表o1会排在o2前面, 当该方法返回正数值时, 代表o1会排在o2后面, 当返回0时, 代表o1与o2的位置不变.
或者用另一种方式理解, 即理解方式二:
- 参数o1代表前面一个元素, o2代表后面一个元素.
- 当该方法返回负数值时, 代表o1与o2的位置不做交换, 当该方法返回正数值时, 代表o1与o2的位置进行交换, 当返回0时, 代表o1与o2的位置不变.
以上两种方式的理解对于该方法的结果是同等效果的, 如果是初学者需要硬性记忆, 择其一即可.
三. 举例说明
现在带入以上第二条的理解, 重写 int compare(T o1, T o2) 方法来对以下集合排序:
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
list.add(4);
list.add(5);
- 按集合元素从小到大排序:
//正序排列: 即元素数值小的在前面, 元素数值大的在后面
list.sort((o1, o2) -> {
// 理解方式一: 前一元素小于后一元素, 则将前一元素排在后一元素前面(返回负数)
// 理解方式二: 前一元素小于后一元素, 则前一元素与后一元素位置不交换(返回负数)
if (o1 < o2) {
return -1;
}
// 理解方式一: 前一元素大于后一元素, 则将前一元素排在后一元素后面(返回正数)
// 理解方式二: 前一元素大于后一元素, 则前一元素与后一元素位置交换(返回正数)
if (o1 > o2) {
return 1;
}
// 理解方式一/二: 前一元素等于后一元素, 则前一元素与后一元素位置不变(返回0)
return 0;
});
System.out.println(list); //输出: [1, 2, 3, 4, 5]
- 按集合元素从大到小排序:
//倒序排列: 即元素数值大的在前面, 元素数值小的在后面
list.sort((o1, o2) -> {
if (o1 < o2) {
// 理解方式一: 前一元素小于后一元素, 则将前一元素排在后一元素后面(返回正数)
// 理解方式二: 前一元素小于后一元素, 则前一元素与后一元素位置交换(返回正数)
return 1;
}
// 理解方式一: 前一元素大于后一元素, 则将前一元素排在后一元素前面(返回负数)
// 理解方式二: 前一元素大于后一元素, 则前一元素与后一元素位置不交换(返回负数)
if (o1 > o2) {
return -1;
}
// 理解方式一/二: 前一元素等于后一元素, 则前一元素与后一元素位置不变(返回0)
return 0;
});
System.out.println(list); //输出: [5, 4, 3, 2, 1]
热门推荐
通过理解睡眠,去睡得更好,提升工作效率
需求来回变,是领导的问题,还是没做好向上管理?
全球固态电池市场:未来5年增长预测揭秘!
怀孕的年龄是否有上限?高龄女性怀孕还有机会吗?
童年的回忆":高尔基自传体小说里的成长故事!
Excel中F检验的计算方法与应用
打造完美雨林生态缸:从材料选择到日常维护的全攻略
人工智能在商业决策支持中的六大应用场景
低钠血症是什么病
媒体:解决剩菜剩饭问题,需在传承传统和适应现代生活间找到平衡
过生日按阴历还是阳历?原来不能随便过,很多人都做错了!
在信阳多停留一天竟然是为了一碗面
全球每年仍然有上千万肺结核新发患者,出现7类症状,及时就医
美人出浴:艺术与文学中的魅力再现
初次见领导时应该怎么说
眼睛里长了红血丝不要轻视!有红血丝后这5件事你一定要做!
更换滤芯的步骤有哪些?这些步骤的注意事项如何?
PCR,RT-PCR,实时荧光定量PCR的区别与联系
需要看鸡眼挂什么科
香煎三文鱼头:深海美味的另一种打开方式
喉咙痛里面带好血丝什么情况
电脑屏幕出现亮线和暗点怎么办?多种实用解决方案帮你轻松应对屏幕故障
Nature再发招聘调查:学术界和工业界大不同,帮你避坑从简历到面试的N个细节
经济学门下的留学热门选择:国际经济与贸易专业
曹操与夏侯惇:堂兄弟以外的深厚情谊
上海车牌如何进行合法租赁?租赁沪牌时需要注意哪些事项?
挽救自卑男人的自信重建之路(重建自信心的有效方法与技巧)
有美国绿卡能随时往返中国吗?解锁中美自由往返的关键信息
武则天与科举制度的改革——开启平民仕途新篇章
刘焱:要让幼儿玩“真游戏”,更要支持和引导幼儿玩“好游戏”