当前位置: 首页 > news >正文

Java-----Comparable接口和Comparator接口

在Java中,我们会经常使用到自定义类,那我们如何进行自定义类的比较呢?

1.Comparable接口

普通数据的比较

        int a=10;int b=91;System.out.println(a<b);

那自定义类型可不可以这样比较呢?看一下代码

6bdf30df004947c5a3408055fb640003.png

我们发现会报错,因为自定义类型,stu1和stu2里面存的是引用,是无法直接根据姓名或年龄进行比较的。

1.1Comparable接口的使用

 如果想要自定义类型根据年龄和名字进行比较,这时候就要用到我们的Comparable接口。

54111f81c7bf4d569009d9641ad604d4.png

当我们观察Comparable接口的底层细节会发现有一个<T>和一个方法,<T>代表我们要比较的类型,方法是我们根据实际情况来重写compareTo方法,也就是比较的规则。

1.根据年龄比较 

自定义类中具体实现

class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Student o) {//根据年龄比较/*if(this.age>o.age){return 1;}else if (this.age==o.age){return 0;}else {return -1;}*/return this.age-o.age;}
}

完整代码

class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Student o) {//根据年龄比较/*if(this.age>o.age){return 1;}else if (this.age==o.age){return 0;}else {return -1;}*/return this.age-o.age;}
}
public class Test {public static void main(String[] args) {Student stu1=new Student("zhansan",18);Student stu2=new Student("man",24);System.out.println(stu1.compareTo(stu2));}
}

2.根据名字比较

class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}
}
public class Test {public static void main(String[] args) {Student stu1=new Student("zhansan",18);Student stu2=new Student("man",24);System.out.println(stu1.compareTo(stu2));}
}

由于名字是String类,String类在底层中也实现了compareTo方法,所以我们可以直接调用compareTo方法来实现名字的比较。

3. 多个对象之间的比较

多个对象我们可以用一个对应类的数组来存储,然后思路就是让数组里面的元素就行比较。

这里模拟了冒泡排序进行比较。

根据名字来排序

import java.util.Arrays;class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {return this.name.compareTo(o.name);}
}
public class Test {public static void mysort(Comparable[] comparables){for (int i = 0; i < comparables.length-1; i++) {for(int j=0;j<comparables.length-1-i;j++){if(comparables[j].compareTo(comparables[j+1])>0){Comparable tmp=comparables[j];comparables[j]=comparables[j+1];comparables[j+1]=tmp;}}}}public static void main(String[] args) {Student[] students=new Student[]{new Student("zhansan",18),new Student("man",24),new Student("lebron",23)};mysort(students);System.out.println(Arrays.toString(students));}
}

5dbe17b651df48f2862d2f35deb2ae09.png

根据年龄来排序

import java.util.Arrays;class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {return this.age-o.age;}
}
public class Test {public static void mysort(Comparable[] comparables){for (int i = 0; i < comparables.length-1; i++) {for(int j=0;j<comparables.length-1-i;j++){if(comparables[j].compareTo(comparables[j+1])>0){Comparable tmp=comparables[j];comparables[j]=comparables[j+1];comparables[j+1]=tmp;}}}}public static void main(String[] args) {Student[] students=new Student[]{new Student("zhansan",18),new Student("man",24),new Student("lebron",23)};mysort(students);System.out.println(Arrays.toString(students));}
}

c6c90da46f6a4de593d9ef705bc21934.png

 3.总结

1.当前阶段如果我们想要进行自定义类型之间的比较,我们要使用Comparable接口。

2.重写接口里面的方法是我们根据需求来决定如何重写compareTo方法,重写后的compareTo方法里面的具体实现就是我们的比较规则。

2.Comparator接口

我们发现当我们使用Comparable接口时并不是那么灵活,因为它实现的比较规则是写死的,如果我们想要换一种比较规则,我们必须要对实现对比较方法里面的重新构造。

那有没有比较灵活的比较方式呢?答案就是Comparator接口。

AgeComparator类

public class AgeComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.age- o2.age;}
}

NameComparator类

public class NameComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.name.compareTo(o2.name);}
}

主函数部分

根据年龄排序

public class Test {public static void main(String[] args) {Student[] students=new Student[]{new Student("zhansan",18),new Student("man",24),new Student("lebron",23)};NameComparator nameComparator=new NameComparator();AgeComparator ageComparator=new AgeComparator();Arrays.sort(students,ageComparator);System.out.println(Arrays.toString(students));}
}

35b307211565411f8fbd235f41347ebe.png

根据名字比较

public class Test {public static void main(String[] args) {Student[] students=new Student[]{new Student("zhansan",18),new Student("man",24),new Student("lebron",23)};NameComparator nameComparator=new NameComparator();AgeComparator ageComparator=new AgeComparator();Arrays.sort(students,nameComparator);System.out.println(Arrays.toString(students));}
}

725a56b1be3a42a2abc0d7ad91f2b4f3.png

这里我们定义了AgeComparator类和NameComparator类,它们都使用了Comparator这个接口,

然后在自己的类里面重写了compareTo方法。

根据以上类实现的对象可以认为是比较规则,将这些对象作为sort函数的参数,就可以灵活实现不同比较方式的转变。

相对于Comparable接口来说,Comparator不需要改变函数内部的具体实现来改变比较规则,只需改变函数的参数就行了,这样更安全也更方便。 

相关文章:

Java-----Comparable接口和Comparator接口

在Java中&#xff0c;我们会经常使用到自定义类&#xff0c;那我们如何进行自定义类的比较呢? 1.Comparable接口 普通数据的比较 int a10;int b91;System.out.println(a<b); 那自定义类型可不可以这样比较呢&#xff1f;看一下代码 我们发现会报错&#xff0c;因为自定义…...

通信技术体会

比如 pcie可以看成是全连接的ahb bus&#xff0c;但又不是。 因为pcie还是axi&#xff08;神似split/cutthrough&#xff09;。&#xff08;axi更多是接口而不是bus&#xff09;。 pcie虽然物理层和usb都是serdes&#xff0c;但transaction layer就是上面这样的&#xff0c;也就…...

Linux系统安全及其应用

文章目录 一、用户账号安全管理1.1 系统账号的清理1.2 对用户账号的操作1.2.1 锁定和解锁用户1.2.2 删除无用账号 1.3 对重要文件进行锁定1.4 密码安全控制1.4.1 新建用户1.4.2 已有用户 二、历史命令管理2.1 历史命令限制2.2 自动清空历史命令 三、设置终端登录的安全管理3.1 …...

JVM内存划分类加载的过程双亲委派模型的详解

JVM内存划分 JVM也就是java进程&#xff0c;这个进程一旦跑起来就会从操作系统这里申请一大块内存空间&#xff0c;JVM接下来就要进一步的对这个大的空间进行划分&#xff0c;划分成不同区域&#xff0c;从而每个区域都有不同的功能作用&#xff0c;一共分为如下几个区域 1.堆…...

Java异常详解

Java异常详解 前言一、异常类的定义Java异常异常类的构成Java常见运行错误异常示例除以 0数组下标越界访问 null 对象 防御式编程异常的好处LBYL 风格的代码EAFP 风格的代码 二、异常的基本用法捕获异常基本语法代码示例不处理异常使用 try catch 后的程序执行过程catch 只能处…...

C++入门3——类与对象2(类的6个默认成员函数)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 构造函数的概念 2.2 构造函数的特性 3. 析构函数 3.1 析构函数的概念 3.2 析构函数的特性 4.拷贝构造函数 4.1 拷贝构造函数的概念 4.2 拷贝构造函数的特性 5.赋值运算符重载函数 5.1运算符重载函数 5.2 赋值运算符重…...

CobaltStrike基本渗透

目录 CobaltStrike简介 主要功能&#xff1a; 使用注意&#xff1a; 在使用CobaltStrike进行渗透测试时&#xff0c;务必遵守法律法规&#xff0c;并获得合法授权。 CobaltStrike安装 前提 安装 服务端安装 windows安装 CS基本使用 监听器配置 一些基本的攻击…...

【linux深入剖析】进程间通信

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.进程间通信目的2. 什么…...

关系数据库:关系模式

文章目录 基本概述关系的相关名词术语笛卡儿积与关系关系的类型 关系模式总结 基本概述 关系的相关名词术语 关系&#xff1a;简单来说&#xff0c;就是一张二维表格。属性(Attribute)&#xff1a;也称字段或列&#xff0c;在现实世界中&#xff0c;要描述一个事务常常取若干…...

医学图像处理质量的评价方法

评判处理后医学图像的质量是确保图像处理技术有效性和可靠性的关键。以下是一些常用的图像质量评估方法和指标&#xff1a; 1. 主观评估 主观评估是由专业人员&#xff08;如放射科医生&#xff09;通过视觉检查对图像质量进行评分。常用的主观评估方法包括&#xff1a; 视觉…...

Ehcache Java 缓存框架

详解 下图是 Ehcache 在应用程序中的位置&#xff1a; Ecache 是一个广泛使用的 Java 缓存框架&#xff0c;能够有效提升应用性能&#xff0c;并减少与后端数据库的交互次数。它采用了一系列高级缓存策略&#xff0c;包括内存缓存、磁盘缓存、分布式缓存等&#xff0c;并提供了…...

详解Spring IoCDI(二)

目录 承接上文&#xff1a;详解Spring IoC&DI &#xff08;一&#xff09; 1.IoC详解 1.1方法注解Bean 1.2方法注解要配合类注解使用 1.3定义多个对象 1.4重命名Bean 1.5扫描路径 2.DI详解 2.1DI与IoC的关系 2.2属性注入 2.3构造方法注入 2.4Setter注入 2.5 三…...

说明白计算机网络之TCP的流量控制与拥塞控制之慢开始算法与拥塞避免算法

TCP的流量控制 利用滑动窗口实现流量控制 设A向B发送数据&#xff0c;连接建立时候&#xff0c;B告诉A自身的接收窗口大小&#xff0c;A的发送窗口大小不能超过接收方B的窗口大小 流量控制&#xff1a;发送方发送速率不要太快&#xff0c;要让接收方来得及接收。窗口大小的单…...

这款信创FTP软件,可实现安全稳定的文件传输

信创&#xff0c;即信息技术应用创新&#xff0c;2018年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;国家将信创产业纳入国家战略&#xff0c;并提出了“28n”发展体系。“8”具体指金融、石油、电力、电信、交通、航空航天、医院、教育等主要行业。目前企业使用比较…...

代码随想录算法训练营第十天|232.用栈实现队列、225. 用队列实现栈

232.用栈实现队列 题目链接&#xff1a;232. 用栈实现队列 文档讲解&#xff1a;代码随想录 状态&#xff1a;写出来 &#xff0c;但差强人意 思路&#xff1a; 定义两个容器&#xff0c;可以是Stack&#xff0c;也可以是Deque&#xff0c;stackIn相当于临时容器,用来存放元素&…...

STM32 IIC协议

本文代码使用 HAL 库。 文章目录 前言一、什么是IIC协议二、IIC信号三、IIC协议的通讯时序1. 写操作2. 读操作 四、上拉电阻作用总结 前言 从这篇文章开始为大家介绍一些通信协议&#xff0c;包括 UART&#xff0c;SPI&#xff0c;IIC等。 UART串口通讯协议 SPI通信协议 一、…...

Java生成随机数的几种方式

随机数&#xff0c;在一些特殊场景下&#xff0c;是非常常用的。比如一些测试和验证场景、安全加密、随机抽样等都有随机数的‘身影’。 一、 使用java.util.Random类 java.util.Random类提供了更全面的随机数生成功能&#xff0c;包括随机整数、随机浮点数、随机布尔值等。 p…...

【面试】什么是Java虚拟机

目录 1. 说明2. 关键点 1. 说明 1.Java虚拟机&#xff08;Java Virtual Machine&#xff0c;简称JVM&#xff09;是运行所有Java程序的抽象计算机&#xff0c;是Java语言的运行环境。2.JVM是Java平台无关性的关键&#xff0c;它允许Java程序在任何支持JVM的硬件和操作系统上运…...

Go 语言的基本构成、要素与编写规范

Go 语言&#xff0c;作为由 Google 开发的现代编程语言&#xff0c;以其简洁、高效和并发编程能力而著称。在构建高性能分布式系统和现代软件开发中&#xff0c;Go 语言正日益受到欢迎。本篇文章将详细探讨 Go 语言程序结构的各个要素&#xff0c;包括函数定义、注释规范、数据…...

从了解到掌握 Spark 计算框架(二)RDD

文章目录 RDD 概述RDD 组成RDD 的作用RDD 算子分类RDD 的创建1.从外部数据源读取2.从已有的集合或数组创建3.从已有的 RDD 进行转换 RDD 常用算子大全转换算子行动算子 RDD 算子综合练习RDD 依赖关系窄依赖宽依赖宽窄依赖算子区分 RDD 血统信息血统信息的作用血统信息的组成代码…...

告别重复造轮子:用快马AI一键生成高复用性imToken集成代码模块

告别重复造轮子&#xff1a;用快马AI一键生成高复用性imToken集成代码模块 开发涉及钱包集成的DApp时&#xff0c;最让人头疼的就是那些重复性的基础代码。每次新项目都要重新写一遍连接钱包、处理授权、监听网络切换的逻辑&#xff0c;不仅浪费时间&#xff0c;还容易引入安全…...

Pyrene-PEG-Sil,芘丁酸酯聚乙二醇三乙氧基硅烷,荧光特性对微环境变化高度敏感

一.名称英文名称&#xff1a;Pyrene-PEG-Silane&#xff0c;Pyrene-PEG-Sil&#xff0c;Py-PEG-Silane&#xff0c;Py-PEG-Sil中文名称&#xff1a;芘丁酸酯聚乙二醇三乙氧基硅烷&#xff0c;芘丁酸酯-PEG-三乙氧基硅烷分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&…...

Bootstrap 下拉菜单:全面解析与应用指南

Bootstrap 下拉菜单&#xff1a;全面解析与应用指南 引言 Bootstrap 是一个流行的前端框架&#xff0c;它提供了丰富的组件和工具来帮助开发者快速构建响应式、美观的网页。其中&#xff0c;下拉菜单是 Bootstrap 中一个常用且重要的组件&#xff0c;它能够帮助用户在有限的空间…...

如何一键备份QQ空间历史说说:完整数据备份与隐私保护指南

如何一键备份QQ空间历史说说&#xff1a;完整数据备份与隐私保护指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心那些记录青春的QQ空间说说会随着时间流逝而消失&#xf…...

相场法模拟二元合金中考虑溶质偏析的comsol枝晶生长研究

comsol枝晶生长相场法模拟 二元合金 考虑溶质偏析枝晶生长这玩意儿在材料模拟里算是经典难题了。咱们用相场法搞COMSOL模拟的时候&#xff0c;最刺激的就是看那些枝晶分叉怎么从混乱中长出来。这次搞的是二元合金体系&#xff0c;重点得盯着溶质偏析这个捣蛋鬼——它能让晶体长…...

从零开始理解JVM内存模型:如何避免OOM错误的7个实用技巧

从零开始理解JVM内存模型&#xff1a;如何避免OOM错误的7个实用技巧 第一次在线上环境遇到OOM错误时&#xff0c;我盯着控制台那行刺眼的java.lang.OutOfMemoryError整整愣了三分钟。那是一个看似普通的周二下午&#xff0c;我们的订单处理系统突然开始拒绝服务&#xff0c;而监…...

如何3分钟制作专业证件照?HivisionIDPhotos免费AI工具全攻略

如何3分钟制作专业证件照&#xff1f;HivisionIDPhotos免费AI工具全攻略 【免费下载链接】HivisionIDPhotos ⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。 项目地址: https://gitcode.com/GitHub_Trending/hiv/Hi…...

什么是焦糖布丁理论?用 JTBD 做软件产品设计的四步法

“焦糖布丁理论”其实是对 Jobs to Be Done&#xff08;JTBD&#xff0c;待办任务理论&#xff09; 的一种本土化、形象化的称呼&#xff0c;源自哈佛商学院教授 克莱顿克里斯坦森&#xff08;Clay Christensen&#xff09; 在其著作《与运气竞争》&#xff08;Competing Again…...

nRF52与RFX2401C的PA+LNA优化方案:基于SoftDevice的高效驱动实现

1. 为什么需要PA和LNA优化方案 如果你正在用nRF52开发BLE设备&#xff0c;可能会遇到这样的困扰&#xff1a;明明参数配置没问题&#xff0c;但通信距离就是达不到预期。这时候就该请出我们今天的主角——RFX2401C这颗PA/LNA芯片了。我去年做智能牧场项⽬时就踩过这个坑&#…...

Vue 3.4+ 实验性/新特性深度实战(2026版)

一、背景&#xff1a;从“稳定”到“极致体验”截至 2026 年&#xff0c;Vue 3.4 与 3.5 已全面普及&#xff0c;但许多能​​显著降低心智负担​​的特性&#xff08;如 defineModel&#xff09;在早期被标记为“实验性”&#xff0c;或仅在 3.5 才完全稳定。如果你还在写“Pr…...