Java(十二)——Comparable接口与Comparator接口
文章目录
- Comparable与Comparator接口
- Comparable接口
- Comparator接口
Comparable与Comparator接口
我们可能会遇到这样的问题:怎么对一个对象数组进行排序? 比如对一个狗类对象数组进行排序,而想到这,我们又会有一个问题:怎么比较两个对象?如果我想自定义标准,怎么办?
与基本类型的比较并排序不同,对象数组没有一个统一的标准来进行比较来排序,此时就可以基于Comparable
接口实现或者基于比较器实现(Comparator
接口)
- 自然排序:基于Comparable接口
- 定制排序:基于Comparator接口
本文均以自定义的Person
类为例:
public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}}
Comparable接口
使用了Comparable
接口,意味着此类可排序,使用方法是:在想要实现比较的类中实现Comparable
接口并重写compareTo()
方法
我们先观察一下Comparable
接口的源码:
我们发现,Comparable
接口中只有一个CompareTo
方法
观察完毕后,我们看如下实现代码:
//Person.java
//实现Comparable接口
public class Person implements Comparable<Person> {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}//重写compareTo方法,这里按照name(字符串)比较@Overridepublic int compareTo(Person o) {if(this.name.compareTo(o.name) > 0) {return 1;}else if(this.name.compareTo(o.name) < 0) {return -1;}else {return 0;}}
}//Test.java
import java.util.Arrays;public class Test {public static void main(String[] args) {Person[] people = new Person[]{new Person("zhangsan", 23), new Person("lisi", 15),new Person("wangwu", 42)};//实现了Comparable接口后,可以通过Arrays类中的排序方法给对象数组排序了Arrays.sort(people);for(Person p : people) {System.out.println(p);}}
}
打印结果如下:
-
Comparable
接口后面的<>
是泛型知识,传入要比较的类即可 -
实现
Comparable
接口必须重写CompareTo
方法,方法要求返回int
类型的值,一般内部实现的逻辑:调用方法的对象 > 作为参数的对象,返回正数;调用方法的对象 < 作为参数的对象,返回负数;调用方法的对象 == 作为参数的对象,返回0
-
一个类实现了
Comparable
接口,那么就可以调用Arrays
类中的sort
方法对存放此类对象的数组进行排序 -
一个实现了
Comparable
接口的类只能重写一个compareTo
方法,这也意味着标准被固定
Comparator接口
前面提到,基于Comparable
接口实现比较的标准固定,且不便在原代码修改,这种情况下,我们可以通过Comparator
接口(比较器)实现,方法是:定义一个或多个比较器类,实现Comparator
接口,并重写Compare
方法
我们先观察一下Comparator
接口的一部分源码:
这部分源码显示,Comparator
接口中包含compare
和equals
方法,实现了Comparator
接口的类可以不重写equals
方法,但是一定要重写compare
方法
观察完毕后,我们看如下实现代码:
//Person.java
public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}}//AgeComparator.java
//以年龄比较的比较器
import java.util.Comparator;public class AgeComparator implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {return o1.getAge() - o2.getAge();}
}//NameComparator.java
//以名字比较的比较器
import java.util.Comparator;public class NameComparator implements Comparator<Person> {@Overridepublic int compare(Person o1, Person o2) {return o1.getName().compareTo(o2.getName());}
}//Test.java
import java.util.Arrays;public class Test {public static void main(String[] args) {Person[] people = new Person[]{new Person("zhangsan", 23), new Person("lisi", 15),new Person("wangwu", 42)};//使用时,必须实例化比较器对象AgeComparator ageComparator = new AgeComparator();NameComparator nameComparator = new NameComparator();//正常使用System.out.println(ageComparator.compare(new Person("张三", 16), new Person("李四", 10)));//与Arrays类中的sort方法配合使用Arrays.sort(people, ageComparator);for(Person p : people) {System.out.println(p);}}
}
打印结果如下:
- 要比较的对象的类不需要实现
Comparator
接口,比较器需要实现Comparator
接口,并在<>
内给出要比较的类,并重写compare
方法 - 重写的
compare
方法有两个参数,分别是要比较的两个对象,重写的compare
方法要求:返回值的正负以及零,表示不同的比较结果。例如,左参数对象大于右参数对象,返回正值;左参数对象小于右参数对象,返回负值;左右参数对象相等,返回0 - 使用时,必须实例化比较器类对象。可以选择直接调用其中的
compare
方法比较单一对象,也可以配合Arrays
类中的sort
方法对对象数组进行排序,此时sort
方法需要两个参数:1. 对象数组 2. 比较器对象 - 比较器可以创建若干个,意味着我们可以定义多个标准,相对灵活一些
区别:
Comparable
相当于 “内部比较器”,Comparator
相当于 “外部比较器”- 对于基于
Comparable
的比较,需要手动实现接口,侵入性比较强,但一旦实现,每次调用该类都有顺序,属于内部顺序- 对于基于
Comparator
的比较,需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强
侵入性:让用户代码产生对框架的依赖,这些代码不能直接脱离框架使用,不利于代码的复用
关于对象的比较,数据结构部分会经常用到
我们的SE部分的补充知识到此结束了,小裤马上会发一篇SE语法合集
相关文章:
Java(十二)——Comparable接口与Comparator接口
文章目录 Comparable与Comparator接口Comparable接口Comparator接口 Comparable与Comparator接口 我们可能会遇到这样的问题:怎么对一个对象数组进行排序? 比如对一个狗类对象数组进行排序,而想到这,我们又会有一个问题ÿ…...
Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统
株洲中车时代电气股份有限公司(下称中车时代电气)是中国中车旗下股份制企业,其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲,走好两条钢轨,走出两条钢轨。中车时代电气秉承“双…...
笔记 | 软件工程01:从程序到软件
1 软件工程知识域 2 程序 2.1 何为程序及程序的质量要求 何为程序: 理解:软件工程可能就是在弥补OOP语言与自然语言之间还存在的鸿沟 2.1.1 程序质量的内在和外在体现 2.1.2 程序质量的语法和语义体现 2.2 编写代码的基本原则 2.3 程序质量保证方法 …...
废品回收小程序开发,助力商家拓展回收市场
随着互联网的快速发展,废品回收行业也走向了数字化发展,废品回收小程序成为了拓展市场的重要方式。在当下万亿元下的回收市场中,废品回收小程序的发展也能够发挥重要作用,提高市场回收效率,提高大众的回收意识…...
JVM类加载机制和双亲委派
类加载机制 java文件需要编译成字节码文件(.class文件),jvm是通过类加载机制,将.class文件加载进内存,经过验证连接->初始化直到使用该对象的过程就是类加载机制,当new对象的时候,jvm首先去常量池寻找该类的符号引用…...
【PyCharm】无法创建虚拟环境,提示:has no attribute CPython3macOsBrew
报错信息: AttributeError: module virtualenv.create.via_global_ref.builtin.cpython.mac_os has no attribute CPython3macOsBrew报错原因: 可能含有多个virtualenv,发生冲突了。 解决方法: 终端执行以下命令: p…...
华为OD刷题C卷 - 每日刷题 12(数组连续和,求最多可以派出多少支团队)
1、(数组连续和): 这段代码是解决“数组连续和”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于计算给定数组中有多少个连续区间的和大于等于给定值x。 main方法首先读取数组的长度n和阈值x&…...
2.1 初识Windows程序
Windows程序设计是一种面向对象的编程。Windows操作系统以数据结构的形式定义了大量预定义的对象作为操作系统的数据类型。Windows动态链接库提供了各种各样的API接口函数供Windows应用程序调用。一个Windows应用程序是运行在Windows操作系统之上的。这些API接口函数的调用所实…...
EDI系统的使用场景
EDI全称Electronic Data Interchange,中文名称是电子数据交换。EDI系统是专为企业间的电子数据传输而设计的,需要满足的基本功能包括:支持AS2、OFTP、SFTP等EDI传输协议,能够生成和解析符合X12、EDIFACT、VDA等EDI报文标准下的报文…...
韩国Neowine推出第三代强加密芯片ALPU-CV
推出第三代加密芯片;是ALPU系列中的高端IC;是一款高性能车规级加密芯片;其加密性更强、低耗电、体积小;使得防复制、防抄袭板子的加密性能大大提升,该芯片通过《AEC-Q100》认证,目前已经在国产前装车辆配件…...
golang结构与接口方法实现与交互使用示例
1.定义结构 // 结构定义 type VideoFrame struct {id inthead []bytelen int64data []byte } 2.实现结构方法 // 生成结构字段的get与set方法 // func (v *VideoFrame) Id() int {return v.id }func (v *VideoFrame) SetId(id int) {v.id id }func (v *VideoFrame) He…...
C# 判断字符串不等于空的示例
在C#中,要判断一个字符串是否不等于空(即它既不是null也不是空字符串""),方法有如下几种,如下。 方法1 使用逻辑运算符和string.IsNullOrEmpty方法 string myString "123"; // 假设要检查的字…...
直方图中最大的矩形
#include<iostream> #include<algorithm> using namespace std; const int N 100010; //l[i], r[i]表示第i个矩形的高度可向两侧扩展的左右边界 int h[N], q[N], l[N], r[N]; typedef long long LL; int main() { int n; while(scanf("%d"…...
分布式锁redisson
1:pom.xml添加依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.21.1</version> </dependency>2-1:方法一:读取默认ym…...
将小爱音箱接入 ChatGPT 和豆包ai改造成专属语音助手
这个GitHub项目,mi-gpt,旨在将小爱音箱和米家设备与ChatGPT和豆包集成,有效地将这些设备转变为个性化语音助手。以下是对其功能和设置的详细分析: 主要特点 角色扮演:该项目允许小爱适应不同的角色,如伴侣…...
短网址生成原理及使用
生成短网址介绍: 一、定义 短网址(Short URL)是形式上比较短的网址,它通过将原始冗长的网址进行缩短,方便用户分享和记忆。短网址的生成主要依赖于特定的算法和服务,通过后端服务转向来实现网址的缩短。 …...
C#调用word组件转pdf,遇到视图保护解决方法
由于我们在自己项目里常常要调用office组件将word另存pdf格式,但是常遇到用户上传的word视图保护, 组件不能正常打开word而导致不能有效转pdf(原因是文件被WPS编辑过),困扰很长时间,各种方法用过如用第三方组件替换office组件&…...
NAT端口映射,实现外网访问内网服务器
目录 前言一、搭建网络拓扑1.1 配置server和pc1.1.1 配置server01.1.2 配置server11.1.3 配置pc0 1.2 配置客户路由器1.2.1 配置路由器IP1.2.2 配置静态路由 1.3 配置ISP路由器 二、配置端口映射2.1 在客户路由器配置端口映射2.2 测试公网计算机访问私网服务器2.2.1 PC0向serve…...
【面试笔记】嵌入式软件工程师,汽车电子软件相关
文章目录 1. C语言基础1.1 const1.2 static1.3 回调函数的用法1.4 宏定义1.5 编译、链接过程1.6 堆与栈的区别?1.7 简单的字符串算法题,C语言实现1.7.1 给定一个字符串,按顺序筛选出不重复的字符组成字符串,输出该字符串1.7.2 给定…...
uniapp小程序开发 | 从零实现一款影视类app (后台接口实现,go-zero微服务的使用)
uniapp小程序开发实战系列,完整介绍从零实现一款影视类小程序。包含小程序前端和后台接口的全部完整实现。系列连载中,喜欢的可以点击收藏。 该篇着重介绍获取轮播图后台接口和获取正在热映电影的两个后台接口的实现。 后台服务使用golang,…...
【C#】委托
文章目录 委托自定义委托模板方法(工厂模式回调(callback)函数(观察者模式多播(multicast)委托委托的高级使用使用接口 重构 模板方法代码注意参考 委托 委托(delegate)是一种类型,定义了一种方…...
【面试题】创建两个线程交替打印100以内数字(一个打印偶数一个打印奇数)
阅读导航 一、问题概述二、解决思路三、代码实现四、代码优化 一、问题概述 面试官:C多线程了解吗?你给我写一下,起两个线程交替打印0~100的奇偶数。就是有两个线程,一个线程打印奇数另一个打印偶数,它们交替输出&…...
PgMP考试结束后多久出成绩?附成绩查询方法
PgMP考试结束后多久出成绩?这是许多参加PgMP考试的考生都非常关心的问题。今天就给大家讲解一下PgMP考试多久可以知道成绩? 一、PgMP考试成绩查询时间 PgMP考试一般在考试结束后的6-8周左右才会出成绩,届时PMI官方会通过电子邮件的形式提醒…...
springboot项目Redis统计在线用户
springboot项目Redis统计在线用户 我的项目有个显示用户的遗忘曲线,需要统计在线用户以计算他们的曲线 思考了两种方案,但都是用Redis的bitmap数据结构Bitmap是一种特殊类型的数组,其中每个元素只能存储0或1。在Redis中,Bitmap实际…...
GNeRF论文理解
文章目录 主要解决什么问题?结构设计以及为什么有效果?个人想法。 主要解决什么问题? 本文主要想要解决的问题是 如何使用uncalibrated的照片来进行Nerf重建。虽然说现在已经有了一些方式可以对相机位姿进行估计和优化,但是他们限…...
0531作业 链表
结果 整体代码 主要实现 /**实现* */ #include "./linklist.h"linklist* create_linklist(datatype param){linklist* node(linklist*)malloc(sizeof(linklist));if(NULLnode){puts("节点创建失败");}node->paramparam;node->pnextNULL;puts("…...
C++ STL - 容器
C STL(标准模板库)中的容器是一组通用的、可复用的数据结构,用于存储和管理不同类型的数据。 目录 零. 简介: 一 . vector(动态数组) 二. list(双向链表) 三. deque(…...
AI生成沉浸式3D世界(空间照片/视频)
面向Vision Pro等空间计算设备的产品指南 & 技术实现路径 一、通俗理解 ldi3格式概览:这是一种创新的3D内容格式,专为Vision Pro、Quest等VR头戴设备设计,让你能沉浸在一个几可乱真的三维世界,体验仿佛亲临其境的感受。 内容创作:利用开源工具,结合多角度摄像捕捉,…...
【Vue】异步更新 $nextTick
文章目录 一、引出问题二、解决方案三、代码实现 一、引出问题 需求 编辑标题, 编辑框自动聚焦 点击编辑,显示编辑框让编辑框,立刻获取焦点 即下图上面结构隐藏,下面结构显示,并且显示的时候让它自动聚焦。 代码如下 问题 “…...
【uCOS-III-编程指南】
uCOS-III-编程指南 ■ [野火]uCOS-III内核实现与应用开发实战指南■■■■ ■ [野火]uCOS-III内核实现与应用开发实战指南 添加链接描述 ■ ■ ■ ■...
怎样做自己网站robots/自媒体135网站
如果你在Linux终端中执行”:(){ :|:& };:“,你的计算机会立即崩溃,甚至不用使用root权限。这个字符串就是所谓的fork炸弹。“:(){ :|:& };:”实际上是一段shell脚本,在理解它之前,我们先来看一下shell脚本函数是怎么定义的…...
网站白名单 是什么/搜索引擎优化与关键词的关系
前言 在设计模式中关于工厂模式有一点特殊,就标准意义而言我们一般提到的工厂模式一般包括三种: 简单工厂工厂方法模式抽象工厂模式 其实简单工厂不属于设计模式,由于它的使用场景还是比较多的,因此本篇将会一起介绍一下~ 工厂模…...
电商网站开发资金预算/百度在线识别图片
一、Set对象数据结构 1.Set数据结构类似数组,但是其每个成员都是唯一值,没有重复,且Set本身是一个构造函数,用来生成Set数据结构,用法如下: const setData new Set([1, 2, 1, 3, 5]); console.log(setData…...
安徽省住建厅网站官网/友情链接交换平台源码
目录介绍 01.Java基础[30篇]02.面向对象[15篇]03.数据结构[27篇]04.IO流知识[11篇]05.线程进程[9篇]06.虚拟机[12篇]07.类的加载[7篇]08.反射原理[16篇]09.Java并发[27篇]10.Java异常[11篇]11.枚举与注解[10篇]12.设计模式[8篇]13.Java深入[8篇]好消息 博客笔记大汇总【16年3月…...
网站管理员的联系方式/新网站推广方法
初涉H5的学习,完全萌新一枚,每天虽然疲惫却真的前所未有的充实,不敢有一点懈怠,真的不想时间白白浪费。到今天为止,会了简单的表单制作,还有一点点小小的成就感,多的不说了,下面展示…...
安徽网站建设产品介绍/如何制作网站链接
知识点六:MySQL函数的创建(13) 内置函数: 自定义函数: 首先查看是否已经开启了创建函数的功能: SHOW VARIABLES LIKE ‘%fun%’; 如果变量的值是OFF,那么需要开启 set global log_bin_trust_function_creators1; 创建函…...