Comparable和Comparator的区别
一、概述
Comparable和Comparator都是用来实现比较的,一般用于集合中元素的比较
基本包装类型,Integer、Long以及String都实现了Comparable接口,该接口的排序逻辑必须写在比较对象中,所以又叫自然排序
我们一般集合排序使用的Collections.sort(),默认使用的就是Comparable
public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null);}
当然,我们也可以指定比较器,这里使用的就是Comparator了
public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c);}
二、实际使用
1、Comparable
定义了对象Forlan,实现了Comparable接口,重写了compareTo(对象)方法
public class Forlan implements Comparable<Forlan> {private String name;/*** 身高*/private int height;/*** 体重*/private int weight;public Forlan(String name, int height, int weight) {this.name = name;this.height = height;this.weight = weight;}@Overridepublic String toString() {return "Forlan{" +"name='" + name + '\'' +", height=" + height +", weight=" + weight +'}';}/*** 比较身高*/@Overridepublic int compareTo(Forlan forlan) {return this.height - forlan.height;}
}
验证比较器
List<Forlan> list = new ArrayList<>();
Forlan forlan1 = new Forlan("身高低,体重中", 170, 130);
Forlan forlan2 = new Forlan("身高高,体重低", 180, 120);
Forlan forlan3 = new Forlan("身高中,体重高", 175, 140);
list.add(forlan1);
list.add(forlan2);
list.add(forlan3);
Collections.sort(list);
System.out.println(list);// 运行结果
[Forlan{name='身高低,体重中', height=170, weight=130}, Forlan{name='身高中,体重高', height=175, weight=140}, Forlan{name='身高高,体重低', height=180, weight=120}]
2、Comparator
定义了对象ForlanW,实现了Comparator接口,重写了compare(T o1, T o2)方法
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class ForlanW implements Comparator<ForlanW>{private String name;/*** 身高*/private int height;/*** 体重*/private int weight;public ForlanW(String name, int height, int weight) {this.name = name;this.height = height;this.weight = weight;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}@Overridepublic String toString() {return "ForlanComparator{" +"name='" + name + '\'' +", height=" + height +", weight=" + weight +'}';}@Overridepublic int compare(ForlanW o1, ForlanW o2) {return o1.height - o2.height;}public static void main(String[] args) {List<ForlanW> list = new ArrayList<>();ForlanW forlan1 = new ForlanW("身高低,体重中", 170, 130);ForlanW forlan2 = new ForlanW("身高高,体重低", 180, 120);ForlanW forlan3 = new ForlanW("身高中,体重高", 175, 140);list.add(forlan1);list.add(forlan2);list.add(forlan3);// Collections.sort(list, new HeightComparator()); // 身高比较// Collections.sort(list, new WeightComparator()); // 体重比较// 身高比较Collections.sort(list, (ForlanW o1, ForlanW o2) -> {return o1.height - o2.height;});System.out.println(list);}
}class HeightComparator implements Comparator<ForlanW> {@Overridepublic int compare(ForlanW o1, ForlanW o2) {return o2.getHeight() - o1.getHeight();}
}class WeightComparator implements Comparator<ForlanW> {@Overridepublic int compare(ForlanW o1, ForlanW o2) {return o2.getWeight() - o1.getWeight();}
}
验证比较器
List<ForlanComparator> list = new ArrayList<>();
ForlanComparator forlan1 = new ForlanComparator("身高低,体重中", 170, 130);
ForlanComparator forlan2 = new ForlanComparator("身高高,体重低", 180, 120);
ForlanComparator forlan3 = new ForlanComparator("身高中,体重高", 175, 140);
list.add(forlan1);
list.add(forlan2);
list.add(forlan3);
// Collections.sort(list, new HeightComparator()); // 身高比较
// Collections.sort(list, new WeightComparator()); // 体重比较
// 身高比较
Collections.sort(list,(ForlanComparator o1, ForlanComparator o2)->{return o1.height - o2.height;
});
System.out.println(list);// 运行结果
[ForlanComparator{name='身高低,体重中', height=170, weight=130}, ForlanComparator{name='身高中,体重高', height=175, weight=140}, ForlanComparator{name='身高高,体重低', height=180, weight=120}]
三、总结
1、相同点
Comparable和Comparator都是用于比较排序
2、不同点
- 接口所在包不同:java.lang.Comparable、java.util.Comparator
- 比较逻辑不同:Comparable的在类中,Comparator可以在类中,也可以在类外,但在类中意义不大(简单来说,Comparable是内部比较器,Comparator是外部比较器)
- 排序方法不同:Comparable重写方法compareTo(T o),Comparator重写方法compare(T o1, T o2)
- 在Collections.sort()中使用不同:一个参数,默认是Comparable自然排序,二个参数,需要传入Comparator外部排序
- 排序规则数量限制不同:Comparable唯一,Comparator可以有多个
相关文章:
Comparable和Comparator的区别
一、概述 Comparable和Comparator都是用来实现比较的,一般用于集合中元素的比较 基本包装类型,Integer、Long以及String都实现了Comparable接口,该接口的排序逻辑必须写在比较对象中,所以又叫自然排序 我们一般集合排序使用的Col…...
全15万字丨PyTorch 深度学习实践、基础知识体系全集;忘记时,请时常回顾。
✨ ✨我们抬头便看到星光,星星却穿越了万年. ✨ ✨ 🎯作者主页:追光者♂ 🌸个人简介:在读计算机专业硕士研究生、CSDN-人工智能领域新星创作者🏆、2022年度博客之星人工智能领域TOP4🌟、阿里云…...
简洁易用的记账小程序——微点记账
背景 由于每个月的信用卡账单太过吓人,记性也不是特别的好,加上微信支付宝账单中有些明细不是很明确。比如在京东花销的明细不会记录用户购买了什么,只会记录那个通道支出的。所以,才会有了想自己开发一款记账小程序,…...
Windows平台上达梦数据库的ODBC安装与配置
文章目录概述安装包准备安装ODBC驱动配置ODBC数据源概述 最近很多公司都在响应信创,需要切换到国产数据库,然而很多数据库的一些基础组件的使用都没有一个很明确的官方文档。为了避免更多的人踩坑,本人将踩过的坑总结成博文,分享…...
哈希表的介绍
1.哈希表的介绍 在哈希表中插入、删除或查找一个元素都只需要O(1)的时间,因此经常被用来优化时间效率。 在Java中,哈希表有两个对应的类型,即HashSet和HashMap。 2.HashSet的应用 若每个元素都只有一个值,则用HashSet…...
spring cloud gateway 实现redis动态路由及自动项目路由上报
前言 spring cloud gateway默认为内存存储策略,通过配置文件加载的方式生成路由定义信息 可以看到,RouteDefinitionRepository继承了两个父接口,分别为RouteDefinitionLocator和RouteDefinitionWriter,RouteDefinitionLocator定…...
c++函数对象(仿函数)、谓词、内建函数对象
1、函数对象 1.1 概念 重载函数调用操作符的类,这个类的对象就是函数对象,在使用这个函数对象对应使用重载的()符号时,行为类似于函数调用,因此这个函数也叫仿函数。 注意:函数对象࿰…...
物联网对供应链管理的影响
物联网对于许多行业来说都是一项革命性技术,其应用领域涉及零售、交通、金融、医疗保健和能源等行业。物联网在供应链等流程中已经展示了其深度的潜力。管理、预测和监督应用程序有助于车队运输经理提高配送的运营效率,并增加决策的准确性。如今…...
c++ 那些事 笔记
GitHub - Light-City/CPlusPlusThings: C那些事 1. ① extern extern关键字,C语言extern关键字用法详解 如果全局变量不在文件的开头定义,其有效的作用范围只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在…...
心跳机制Redis
进入命令传播阶段候,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线 master心跳: 指令:PING 周期:由repl-ping-slave-period决定,默认10秒 作用&#…...
蓝桥杯算法训练合集十七 1.数字反转2.试题39713.矮人采金子4.筛法5.机器指令
目录 1.数字反转 2.试题3971 3.矮人采金子 4.筛法 5.机器指令 1.数字反转 问题描述 给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零&…...
第一章 初识 Spring Security
第一章 初识 Spring Security 1、权限管理 权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现了对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资…...
2023-02-20 关于回朔的思考
摘要: 考虑命运来回动荡交织,一些新的规划在不断的扩充, 而一些历史则开始陷入回朔。 有必要对历史和过往做一些规划和思考。 需要注意在这个阶段, 第一优先级是在反刍中将其最大化。 理论层: 一. 数据库的基础理论 ANSI SQL到词法解析和语法解析mysql的SQL层对…...
推荐系统[八]算法实践总结V1:淘宝逛逛and阿里飞猪个性化推荐:召回算法实践总结【冷启动召回、复购召回、用户行为召回等算法实战】
0.前言:召回排序流程策略算法简介 推荐可分为以下四个流程,分别是召回、粗排、精排以及重排: 召回是源头,在某种意义上决定着整个推荐的天花板;粗排是初筛,一般不会上复杂模型;精排是整个推荐环节的重中之重,在特征和模型上都会做的比较复杂;重排,一般是做打散或满足…...
适合初学者的超详细实用调试技巧(下)
我们日常写代码的时候,常常会遇到bug的情况,这个时候像我这样的初学者就会像无头苍蝇一样这里改改那里删删,调试的重要性也就显现出来,这篇文章接着上文来讲解。 上文地址:(8条消息) 适合初学者的超详细实用调试技巧&…...
C# String与StringBuilder 的区分
重点 1)它是比较的栈里面的值是否相等(值比较) 2)Equals它比较的是堆里面的值是否相等(引用地址值比较) 3)Object.ReferenceEquals(obj1,obj2)它是比较的是内存地址是否相等 问题描述: 今日提交代码时候,被检测工具发出修改建议。遂补充一下知识 1.什么…...
【麒麟】基于GPS北斗卫星技术的NTP网络时间服务器
【麒麟】基于GPS北斗卫星技术的NTP网络时间服务器 【麒麟】基于GPS北斗卫星技术的NTP网络时间服务器 麒麟系统NTP授时方案 设计思路: 在通用的麒麟服务器内部固定一块北斗卫星接收模块并引出卫星天线接口,卫星模块接收北斗卫星数据并解码输出时间数据&…...
“互联网+”下劳动关系认定的现状
1. 劳动关系的认定标准。依据目前我国法律的有关规定, 判定劳动关系存在两种情况:其一, 在有书面劳动合同的情况下, 这时应以书面合同作为认定标准;其二, 在没有书面合同的情况下, 则依据2005年劳社部的《关于确立劳动关系有关事项的通知》来认定, 其中第一条:“用人单位招用劳…...
LPWAN及高效弹性工业物联网核心技术方案
20多年前的一辆拖拉机就是一个纯机械的产品,里面可能并没有电子或者软件的构成;而随后随着软件的发展,拖拉机中嵌入了软件,它能控制发动机的功率及拖拉机防抱死系统;接下来,通过融入各种软件,拖…...
OPTIONS FMTSEARCH
FMTSEARCH 指定要检索的格式目录列表,语法如下:OPTIONS FMTSEARCH(catalog-specification-1<catalog-specification-2 … >);使用PROC FORMAT时可以定义格式目录,LIBRARYlibref或LIBRARYlibref.catalog。格式目录可以是libref或libref.…...
uniapp组件-Card卡片:从基础到高级应用全解析
1. 初识uni-app Card卡片组件 第一次接触uni-app的Card卡片组件时,我正为一个电商项目发愁。产品经理要求实现商品列表的卡片式布局,既要有图片展示,又要有价格和购买按钮。当时尝试自己写CSS实现,结果各种兼容性问题让我头疼不已…...
Go语言的Kubernetes编排实践
Go语言的Kubernetes编排实践 1. Kubernetes简介 Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它提供了强大的容器编排能力,使应用程序能够在分布式环境中高效运行。 1.1 Kubernetes的核心概念…...
电动汽车充放电最优调度MATLAB源代码:全局与局部调度策略复现
电动汽车充放电最优调度 matlab 源代码,代码按照高水平文章复现 本文研究了电动汽车充放电调度优化问题。 首先提出了一个全局调度优化问题,优化充电功率以使一天内所有充放电电动汽车的总成本最小。 全局最优解提供全局最小的总成本。 然而࿰…...
-python-langchain框架(3-6-pdf文件分页加载 )
一、PDF分页加载的核心应用场景在实际开发中,分页加载并非多余操作,而是针对特定场景的最优解,尤其适合以下几种情况:大型PDF文件处理:单文件几十页、上百页,甚至更大,一次性加载全部内容会占用…...
Autoware Docker部署实战:从环境配置到镜像拉取全解析
1. Autoware与Docker环境部署概述 自动驾驶开发环境搭建一直是让开发者头疼的问题,尤其是像Autoware这样的大型开源框架。传统本地安装方式需要处理大量依赖关系,稍有不慎就会陷入"依赖地狱"。而Docker容器化部署正好能解决这个痛点——它把整…...
解决 DVWA 联合注入报错:Illegal mix of collations for operation ‘UNION‘ 全指南
一、问题背景在 DVWA 靶场进行 SQL 联合注入测试时,很多小伙伴都会遇到一个经典报错:plaintextIllegal mix of collations for operation UNION这个报错的本质原因非常明确:执行UNION操作时,参与联合查询的多个结果集的字符集&…...
4大维度构建高可靠性加密货币自动交易系统
4大维度构建高可靠性加密货币自动交易系统 【免费下载链接】binance-trade-bot Automated cryptocurrency trading bot 项目地址: https://gitcode.com/gh_mirrors/bi/binance-trade-bot 一、价值定位:为什么专业交易者都在用自动化交易工具? 为…...
Ni8mare高危漏洞来袭:黑客可远程劫持n8n服务器(CVE-2026-21858)
研究人员最新发现,一项被命名为Ni8mare的最高严重级漏洞(CVSS评分10.0),允许远程未授权攻击者完全接管本地部署的n8n工作流自动化平台。该漏洞编号为CVE-2026-21858。据研究人员披露,互联网上存在超过10万台易受攻击的…...
贾子科学定理(Kucius Science Theorem):挑战证伪主义、重构“绝对真理”的科学哲学新论
贾子科学定理(Kucius Science Theorem):挑战证伪主义、重构“绝对真理”的科学哲学新论 摘要 贾子科学定理旨在系统批判波普尔的证伪主义,指出其存在逻辑悖论与文化霸权缺陷。该理论提出科学是“公理驱动、可结构化”的绝对真理…...
从基础到进阶:FUXA SVG编辑器列表过滤功能的技术演进路径
从基础到进阶:FUXA SVG编辑器列表过滤功能的技术演进路径 【免费下载链接】FUXA Web-based Process Visualization (SCADA/HMI/Dashboard) software 项目地址: https://gitcode.com/gh_mirrors/fu/FUXA 在工业自动化HMI/SCADA系统的可视化开发中,…...
