Java基础二十二(对集合元素排序比较)

对集合元素排序比较

1. 使用 Comparable 接口实现默认排序

Comparable 是 Java 中的一个接口,用于定义对象之间的排序规则。

实现了 Comparable 接口的类可以比较其对象的大小(包装类都实现了该接口),从而可以在集合类(如 TreeSet、TreeMap 等)中进行排序和查找操作。这种排序被称为类的自然排序,类的 compareTo() 方法被称为它的自然比较方法。

public interface Comparable<T> {int compareTo(T o);
}

compareTo() 方法的返回值有以下三种情况:

  • 返回负整数:表示当前对象小于传入对象。
  • 返回零:表示当前对象等于传入对象。
  • 返回正整数:表示当前对象大于传入对象。
  • T 是泛型的一种表现方式,表示一种类型。

示例1
学生类 Student 实现了 Comparable 接口,重写了 compareTo() 方法,通过比较总成绩实现对象之间的大小比较。

public class Student implements Comparable{private String name;private int math;private int chinese;public Student(String name, int math, int chinese) {this.name = name;this.math = math;this.chinese = chinese;}public int getMath() {return math;}public int getChinese() {return chinese;}// 获取总成绩public int getTotal() {return math + chinese;}// 根据方法重写比较器@Overridepublic int compareTo(Object o) throws RuntimeException {if (o instanceof Student student) {if (this.getTotal() > student.getTotal()) {return 1;} else if (this.getTotal() < student.getTotal()) {return -1;}// 比较姓名return this.name.compareTo(student.name);}throw new CompareException("类型不匹配");}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", math=" + math +", chinese=" + chinese +'}' + getTotal();}// 自定义异常class CompareException extends RuntimeException {public CompareException() {super();}public CompareException(String message) {super(message);}}
}
public class ComparableExample {public static void main(String[] args) {Student[] stus = {new Student("张三", 23, 90),new Student("李四", 24, 80),new Student("王五", 23, 70),new Student("赵六", 24, 80),new Student("田七", 25, 50)};sort(stus);for (Student student : stus) {System.out.println(student.toString());}}private static void sort(Student[] students) {for (int i = 0; i < students.length - 1; i++) {for (int j = 0; j < students.length - 1 - i; j++) {if (students[j].compareTo(students[j + 1]) < 0) {Student studentTemp = students[j];students[j] = students[j + 1];students[j + 1] = studentTemp;}}}}
}

输出

Student{name='张三', math=23, chinese=90}113
Student{name='赵六', math=24, chinese=80}104
Student{name='李四', math=24, chinese=80}104
Student{name='王五', math=23, chinese=70}93
Student{name='田七', math=25, chinese=50}75

2. 使用 Comparator 接口实现比较器排序

Comparator 是 java 中的一个接口,用于定义对象之间的定制排序规则。

Comparable 接口不同,Comparator 接口允许在排序时使用独立于对象类的比较逻辑,因此可以在不休改对象类的情况下实现多种不同的排序方式,当使用了实现 Comparator 接口的比较器后,默认的 COmparable 比较器就不起作用了。

使用 Comparator 接口需要重写 compare() 方法,该方法的定义语法格式如下:

public interface Comparator<T> {int compare(T o1, T o2);boolean equals(Object obj);
}

示例2
按照语文成绩排序

import java.util.Arrays;
import java.util.Objects;public class ComparableExample {public static void main(String[] args) {Student[] stus = {new Student("张三", 23, 90),new Student("李四", 24, 80),new Student("王五", 43, 70),new Student("赵六", 24, 80),new Student("田七", 25, 50)};// 使用 Arrsys.sort(),传入比较器,实现对多个对象比较ChineseComparator comparator = new ChineseComparator();Arrays.sort(stus, comparator);for (Student student : stus) {System.out.println(student.toString());}// 比较两个对象
//        int n = Objects.compare(stus[1], stus[3], comparator);
//        System.out.println(n);}
package kfm.bases.SetDemo;import java.util.Comparator;public class ChineseComparator implements Comparator {// 按照语文成绩排序@Overridepublic int compare(Object o1, Object o2) {if (o1 != null && o2 != null) {if (o1 instanceof Student student1 && o2 instanceof Student student2) {return student1.getChinese() - student2.getChinese();} else {throw new RuntimeException("数据类型异常");}} else {throw new RuntimeException("空指针异常");}}
}

输出:

Student{name='田七', math=25, chinese=50}75
Student{name='王五', math=43, chinese=70}113
Student{name='李四', math=24, chinese=80}104
Student{name='赵六', math=24, chinese=80}104
Student{name='张三', math=23, chinese=90}113

compare() 方法用于在 Arrays 类调用 sort(比较对象数组, 比较器) 方法时,对两个对象进行比较大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript设计模式(二)——简单工厂模式、抽象工厂模式、建造者模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Java在线OJ项目(三)、前后端交互API模块

Java在线OJ项目&#xff08;三&#xff09;、前后端交互API模块 1. 客户端向服务器请求所有题目 或者 单个题目前端获取所有题目获取一个题目 后端 2. 后端读取前端提交的代码&#xff0c;进行编译运行&#xff0c;返回结果前端提交代码后端处理 1. 客户端向服务器请求所有题目…

Java中的Reference

1. 常用四种引用 快速记忆法&#xff1a;“硬(俗称的强引用) --> 软(SoftReference) --> 弱(WeakReference) --> 虚(PhantomReference)” 此处将常说的“强引用”记忆成“硬引用”可以对应到次席的“软引用”&#xff08;反义词&#xff1a;硬-软&#xff09;这样更容…

SAP-QM-质检操作

一、系统自动创建检验批 1、物料主数据设置 MM03-质量管理-检验设置-04来自生产收货的检验 检验类型 过账到检验库存&#xff1a;勾选进入检验库存 控制检验批&#xff1a;控制检验批的产生方式&#xff0c;按订单产生、按行产生、按凭证产生&#xff0c;例每个物料凭证项目…

C++进阶之多态

多态 多态的概念多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写4.虚函数重写的两个例外5.C11 override 和 final6.重载、覆盖(重写)、隐藏(重定义)的对比 抽象类1.概念2.接口继承和实现继承 多态的原理1.虚函数表2.多态的原理3.动态绑定与静态绑定 单继承和多继承关系…

C++中使用 if…else 进行条件编程

C中使用 if…else 进行条件编程 在 C中&#xff0c;使用 if…else 有条件地执行代码&#xff0c;这种结构类似于下面这样&#xff1a; if (conditional expression)Do something when expression evaluates true; Else // OptionalDo something else when condition evaluate…

ArcGIS将两个相同范围但不同比例或位置的矢量数据移动到相同位置

有两个市图层&#xff0c;一个是正确经纬度的市行政范围图层&#xff0c;另一个是其他软件导出获取的不正确经纬度信息或缺失信息。 如果单纯的依靠移动图层&#xff0c;使不正确的移动到正确位置需要很久。尝试定义投影等也不能解决。 使用ArcMap 的空间校正工具条&#xff…

Python 案例实训教学,支持“教师-学生”双视角切换|ModelWhale 版本更新

学年伊始、辞旧迎新&#xff0c;金秋九月&#xff0c;ModelWhale 迎来新一轮的版本更新&#xff0c;持续优化你的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; • 新增 “教师-学生”双视角切换&#xff08;团队版✓&#xff09; • 新…

Stable Diffusion中的ControlNet插件

文章目录 ControlNet的介绍及安装ControlNet的介绍ControlNet的安装 ControlNet的功能介绍ControlNet的应用与演示 ControlNet的介绍及安装 ControlNet的介绍 ControlNet 的中文就是控制网&#xff0c;本质上是Stable Diffusion的一个扩展插件&#xff0c;在2023年2月份由斯坦…

Android微信数据库解密2

Android微信数据库解密2 上篇文章讲了下微信数据库密码规则,以及相关的代码. 本篇文章主要讲解下使用xpose获取对应的数据库密码. public class HookModule implements IXposedHookLoadPackage {public static final String TAG "HookModule";Overridepublic voi…

git文件夹内容详解

.git文件夹是Git版本控制系统在项目根目录下创建的隐藏文件夹&#xff0c;包含了Git仓库的所有相关信息。如下是.git文件夹中常见的一些内容及其作用&#xff1a; HEAD&#xff1a;指向当前所在的分支&#xff08;或者是一个特定的提交&#xff09;。 branches&#xff1a;存储…

详解排序算法(附带Java/Python/Js源码)

冒泡算法 依次比较两个相邻的子元素&#xff0c;如果他们的顺序错误就把他们交换过来&#xff0c;重复地进行此过程直到没有相邻元素需要交换&#xff0c;即完成整个冒泡&#xff0c;时间复杂度。 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换它们两个&#xff1b;…

Spring Boot实践八--用户管理系统(下)

前面我们在数据库初始化时额外创建了一张任务表&#xff0c;用来模拟处理任务&#xff1a; key模拟业务sendMail模拟用户注册后给用户发送邮件任务&#xff0c;多线程异步任务处理analysisLog模拟每晚定时分析日志业务&#xff0c;定时任务处理 异步任务 异步任务通过方法上…

为何电商行业都在争相使用WhatsApp引流小挂件?

WhatsApp小挂件是嵌入在网站上的聊天小部件&#xff0c;允许访问者同WhatsApp与您联系。点击后&#xff0c;它会将客户带到移动或桌面 WhatsApp应用程序&#xff0c;或者直接打开一个对话框&#xff0c;客户可以在这些地方与您发起对话。让我们看看在您的网站上拥有WhatsApp聊天…

常用激活函数整理

最近一边应付工作&#xff0c;一边在补足人工智能的一些基础知识&#xff0c;这个方向虽然新兴&#xff0c;但已是卷帙浩繁&#xff0c;有时不知从何入手&#xff0c;幸亏有个适合基础薄弱的人士学习的网站&#xff0c;每天学习一点&#xff0c;积跬步以至千里吧。有像我一样学…

PHP多语言代入电商平台api接口采集拼多多根据ID获取商品详情原数据示例

拼多多商品详情原数据API接口的作用是获取拼多多电商平台上某一商品的详细信息&#xff0c;包括商品的标题、价格、库存、图片、描述、包邮信息、销量、评价、优惠券等数据。通过该API接口可以获取到商品的原始数据&#xff0c;用于分析、筛选和展示商品信息。 pinduoduo.item…

复习之docker部署--项目实战

一、实验环境 1.安装7.6虚拟机 最小化安装&#xff0c;不安装图形&#xff01; 2.封装虚拟机 关闭selinux关闭防火墙关闭networkmanager配置网络&#xff0c;保证可以ssh修改主机名添加双向解析配置7.6网络仓库--安装常用的工具 配置完成后&#xff0c;在真机ssh虚拟机 如果…

在Mac终端使用unrar和rar 解压和压缩软件

1、首先从rarlab 网站下载 rar &#xff0f; unrar 工具 rarlab网站&#xff1a; https://www.rarlab.com/download.htm 2、解压缩下载的 tar.gz 压缩包&#xff08;rarmacos-x64-623.tar.gz&#xff09;&#xff0c;在下载目录downloads下自动创建一个rar的目录&#xff0c;其…

(三)Redis——Set

SADD key value SMEMBERS 127.0.0.1:6379> SADD set aaa 1 127.0.0.1:6379> SMEMBERS set aaa 127.0.0.1:6379> SADD set aaa 0 127.0.0.1:6379> SMEMBERS set aaaSISMEMBER 判断 aaa 是否在 set 中 127.0.0.1:6379> SISMEMBER set aaa 1 127.0.0.1:6379>…

从零开始的Hadoop学习(四)| SSH无密登录配置、集群配置

1. SSH 无密登录配置 1.1 配置 ssh &#xff08;1&#xff09;基本语法 ssh 另一台电脑的IP地址 &#xff08;2&#xff09;ssh 连接时出现 Host key verification failed 的解决方法 [atguiguhadoop102 ~]$ ssh hadoop103&#xff08;3&#xff09;回退到 hadoop102 [at…