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]
热门推荐
理解Transformer模型结构
紫微斗数交友宫紫薇含义介绍 会有哪些影响
理解AI大模型的架构、训练与推理
怎样清洗洗衣机内桶最干净(教你如何正确清洁洗衣机内筒)
我国华龙洞发现东亚地区最早“准现代人”
除了VR,目前还有哪些沉浸式技术
电脑蓝屏后重启黑屏怎么办?多种实用解决方案帮你轻松应对
美术生要如何看待艺术中的多元化视角
哪些疾病症状易与艾滋病混淆?一文解析相似病症
Nature重大突破:Geneformer开启基因网络预测新时代
为什么我们总是对前任念念不忘?
雷军的皮衣营销学:一件衣服如何重构科技品牌高端化叙事
VR眼镜有哪些分类 VR眼镜的原理是什么
市场运力趋于饱和,网约车司机何去何从?
如何查询个人所得税以确保合规?个税查询的流程和注意事项有哪些?
防眼疲劳眼镜的效果如何
外资涌向国内市场,人民币汇率现利好
支持人民币结算的国家有哪些?(国际贸易干货知识分享)
王阳明《知行合一》:30句经典智慧名言,启迪人心!
知道了自己的基础代谢,下一步又该怎么办?
纠结一件事情走不出来怎么办
河马很少成为其他动物的猎物,它的存在对生态有什么作用?你知道吗?
高晓松用这首《越过山丘》,致敬心中的大哥李宗盛
美国因素如何影响黄金价格?从货币政策到地缘政治的全面解析
如何判断一个项目的可行性,要知道哪些方面
道家经典《存神炼气铭》,全文仅百余字,却蕴含长生之道,读完身心俱静。
金黄色葡萄球菌是什么病,能治愈吗
灯箱看板项目规划指南
短睡眠基因特征是什么
中沙之战一触即发!赛前形势对中国队很有利,能否把握住良机?