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]
热门推荐
成交量1.9倍变化暗藏玄机,倍量柱助你把握市场先机
更年期来了:这些症状别忽视,这样应对最有效
中央司法警官学院2024年招生政策全解析
苏峻攻破建康城:一万兵马如何撼动东晋政权?
从生活方式到干细胞疗法:围绝经期情绪波动全攻略
糖尿病患者食用粗粮指南:从选材到用量全解析
泡发海参有讲究:纯净水+低温+无油容器,这样做最安全
从24小时到痂皮脱落,激光去疣术后护理这样做
锅包肉的正确打开方式:猪里脊肉+酸甜酱汁
春运云南铁路客流增六成,中老跨境游成新宠
中国专家共识推荐:椎动脉狭窄最新疗法
告别便秘困扰!营养师推荐3天高纤维餐单
月经不规律、潮热出汗?这样应对绝经前症状
鲸鱼的生存秘籍:揭秘海洋霸主的适应能力
万峰林景区
倍量柱识别主力抢筹,三种场景把握最佳买入时机
中华白海豚、布氏鲸、绿海龟:中国海洋生物保护的新星
王者荣耀鲁班七号“电玩小子”最强技能组合攻略
五香粉营养成分权威解析:安全食用指南
一致性、简洁性、易用性:做好手机UI设计的关键
五香粉的秘密:跟着XX学做红烧肉
科技创新引领,上海消杀工作实现智能化升级
重庆驾驶证换证指南
小茴香不只是调味,还能减肥?
2024年手机界面设计完全指南:最新趋势与实用技巧
河北举办有害生物防制员培训班,150余名专业人员参训
从客户洞察到关系维护:销售制胜的十大关键
嫩玉米:天然的肠道清道夫
心理调节,告别便秘烦恼
碳青霉烯类耐药鲍曼不动杆菌感染:中国耐药率高达70%,治疗陷入困境