Java笔记-I/O流之比较器接口对象数组排序

2023-11-05

对象数组排序

内容介绍

1.对象数组直接调用sort()方法报错的原因:

是因为没有定义比较的规则,需要自己定义。


2.如何定义规则?看报错信息:

ClassCastException: demoCompare.Person cannot be cast to java.lang.Comparable

表达的意思就是:
当前比较的对象的那个类没有实现Comparable 接口,在接口中需要定义比较的规则。

这个接口就是比较器接口


3.比较规则:

如果方法返回正整数:表示调用者大于参数对象。
如果方法返回负整数:表示调用者小于参数对象 。
如果方法返回0:表示两个对象相等。


4.比较原理:

Arrays.sort()方法去排序一个对象数组,那么sort()方法里面会自动拿出每一个对象去跟其他对象进行调用比较器接口的compareTo()方法进行比较。


两种比较器

1.Comparable接口

在实体类中覆写compareTo 方法,定义自己的比较规则。

演示代码如下:

1.Person.java实体类

package demoCompare;

public class Person implements Comparable<Person> {
	public String name;
	public int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

	// 先按age升序排序,再按name升序排序
	@Override
	public int compareTo(Person o) {
		if (this.age > o.age) {
			return 1;
		}
		if (this.age < o.age) {
			return -1;
		}
		// 调用String的compareTo()方法,Java帮我们写好了
		return this.name.compareTo(o.name);
	}
}

2.Test.java测试类

public static void main(String[] args) {
	Person[] ps = { new Person("ab", 15), new Person("ad", 13), new Person("ac", 14), new Person("aa", 14) };
	Arrays.sort(ps);
	System.out.println(Arrays.toString(ps));
}

2.Comparator接口

问:如果要比较的对象数组里面的对象对应的类,不是我们自定义的,而是面试时别人提供好的class文件,我们无法修改代码,而这个类又没有实现比较器接口,怎么比较?

答:可以使用第三方比较的类。
用Comparator接口覆写Compare方法。调用sort()方法时,把第三方比较类的对象传入第二个参数使用,sort()自动调用。

这样我们不需要修改实体类的代码!

演示代码如下:

1.Person.java实体类

package demoCompare;

public class Person {
	public String name;
	public int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

2.MyCompare.java排序类

package demoCompare;

import java.util.Comparator;

public class MyCompare implements Comparator<Person> {
	// 排序规则:
	// 先age升序排序
	// 再name降序排序
	@Override
	public int compare(Person o1, Person o2) {
		if (o1.age > o2.age) {
			return 1;
		}
		if (o1.age < o2.age) {
			return -1;
		}
		return o1.name.compareTo(o2.name);
	}

}

3.Test.java测试类

public static void main(String[] args) {
	Person[] ps = { new Person("ab", 15), new Person("ad", 13), new Person("ac", 14), new Person("aa", 14) };
	Arrays.sort(ps);
	System.out.println(Arrays.toString(ps));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java笔记-I/O流之比较器接口对象数组排序 的相关文章

随机推荐

  • MIT最新研究:多个AI协作有助提高大模型推理能力和准确性

    麻省理工学院计算机科学与人工智能实验室 CSAIL 研究团队发现 多个语言模型协同工作胜过单一模型 多个AI协作有助于提高大型语言模型的推理能力和事实准确性 每个语言模型都生成对给定问题的回答 然后整合来自其他代理的反馈 以更新自己的回应
  • 初识QT(十四)——Qt项目界面文件(.ui)及其作用(超详细)

    Qt 项目中 后缀为 ui 的文件是可视化设计的窗体的定义文件 如 widget ui 双击项目文件目录树中的文件 widget ui 会打开一个集成在 Qt Creator 中的 Qt Designer 对窗体进行可视化设计 如图 1 所
  • curl请求返回空白问题

    今天使用curl get请求阿里的接口出现了返回空白问题 但是curl是我之前封装的函数 使用很多次了都没有问题 然后网上也没找到解决方法 后面打印了head查看发现是提示 HTTP 1 1 505 HTTP Version Not Sup
  • 【STL详解】stack

    文章目录 前言 一 STL 二 stack 1 stack的创建 2 stack相关方法 3 如何对satck进行排序 前言 本篇文章将总结SLT stack 以及其常用方法 一 STL STL 是 Standard Template Li
  • 牛客练习赛69 C

    题意 给定 n n n点 m m m边 让你确定一个大小为 n n n的排列使得
  • Backtrader 基本使用教程 — 量化投资实战教程(1)

    都说Python可以用于量化投资 但是很多人都不知道该怎么做 甚至觉得是非常高深的知识 其实并非如此 任何人都可以在只有一点Python的基础上回测一个简单的策略 Backtrader是一个基于Python的自动化回溯测试框架 作者是德国人
  • CUDA samples系列 0.3 vectorAdd

    目录 CPU与GPU同步方法详解 源代码中的同步 同步方法扩展 代码解析 扩展一 vectorAdd nvrtc 扩展二 vectorAddDrv 这份代码非常的简单和基础 就把两个向量相加 CPU与GPU同步方法详解 源代码中的同步 代码
  • vue动态菜单及tag切换

    刚刚接触项目的小伙伴 几乎都接触不到这一块的 因为入职 公司要么有骨干 要么是现有项目维护 所以 对于动态菜单 很好奇 今天带着小伙伴们一起来看看吧 可能有些人接触过 只是看看别人写的代码 觉得都没有问题 没有实际动手去做过 这就应对了那句
  • mock与spy的区别

    mock与spy的区别 1 mock 1 1 mock对象的方法不执行具体逻辑 1 2 使用方法打桩返回给定数据 1 3 mock如何执行具体逻辑 2 spy 2 1 spy对象的方法执行具体逻辑 2 2 spy如何不执行具体逻辑 1 mo
  • java的运行环境是什么_Java运行环境是什么

    Java运行环境 JRE 是一个软件 由太阳微系统所研发 JRE可以让计算机系统运行Java应用程序 JRE的内部有一个Java虚拟机 JVM 以及一些标准的类别函数库 Java 运行环境 Java Runtime Environment
  • 时序预测

    时序预测 Python实现NARX带外源输入的非线性自回归神经网络时间序列预测 目录 时序预测 Python实现NARX带外源输入的非线性自回归神经网络时间序列预测 效果一览 基本介绍 程序设计 参考资料 效果一览 基本介绍 Python实
  • 解决Xampp中mysql无法启动的问题

    很突然的Xampp的mysql就打不开 很疑惑 之前一直可以打开的 然后刚才我启动了一下 就突然启动不了了 我想了一下 并没有出现端口号占用问题呀 而且报错也没有说端口号占用 报错写的很是通俗 然后我查看了日志文件 发现日志文件中也没有描述
  • 【无标题】chatgpt桌面化,桌面应用的安装

    前言 关于chatgpt最近来说可算是大火 不过在我使用过程中发现没事都要上openai的官网过于麻烦 而且卡顿 于是乎就在网上寻找一些方法 发现chatgpt可以桌面化 话不多说 直接上图 1 上github找这位大佬 2 主页往下番找到
  • 测试中BUG定义、测试BUG的等级划分、Bug流程以及Bug解决优先级

    一个优秀的软件测试师不仅仅能够发现软件中的bug 还能分析出bug产生的原因 总结了一些软件测试入门必须要了解和学习的BUG基础知识 主要包括BUG定义 测试BUG的等级划分 Bug流程以及Bug解决优先级等内容 下面一起来梳理一遍这些基础
  • ISE报错NgdBuild:604解决方法

    ISE报错NgdBuild 604解决方法 在使用ISE编写FPGA代码时 从其他地方导入 v文件 运行时会报图片中的错误 解决方法 在单纯的复制黏贴 v文件并且导入到 ISE 的同时 把 ngc文件拷贝过来 如下图所示 Rerun后即可解
  • python fastapi 向页面推送视频流,网站播放python获取的rtsp视频

    代码如下 import cv2 import uvicorn from fastapi import FastAPI Response from fastapi responses import StreamingResponse 创建一个
  • ubuntu安装软件一直0%

    ubuntu安装软件一直0 下载不了东西 更新版本库也不行 可能和dns解析错误有关系 可以修改 etc resolv conf文件 我填写的是北京联通的 请自行查阅自己的 nameserver 127 0 0 53 nameserver
  • 基于SpringBoot的CSGO赛事管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 采用Vue技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse
  • win11安装gcc,g++,配置c++的编译环境

    MinGW Minimalist GNU for Windows download SourceForge net 下载并安装MinGW 可以直接鼠标点击操作 简单的很 选定gcc g 为待安装环境 然后开始安装就可以了 环境变量 右键计算
  • Java笔记-I/O流之比较器接口对象数组排序

    对象数组排序 内容介绍 1 对象数组直接调用sort 方法报错的原因 是因为没有定义比较的规则 需要自己定义 2 如何定义规则 看报错信息 ClassCastException demoCompare Person cannot be ca