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

【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)

看到这句话的时候证明:此刻你我都在努力

加油陌生人

个人主页:Gu Gu Study
专栏:用Java学习数据结构系列
喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹

喜欢的话可以点个赞谢谢了。
作者:小闭


前言

上一篇文章已经给大家大致了解了一下Priority Queue以及它的底层实现--- ,但是其实大家可以发现我们上一篇文章的对象是 int 类型,所以我们进行向上调整和向下调整时我可以使用 “<” “ >” “ ==” 进行比较他们的大小进行比较调整,但是如果我们的Priority Queue 里储存的是一个对象呢?那么这时就涉及到对象的比较了。那么对象如何进行比较就往下看看这篇文章吧。


对象比较的三种方式

对象的比较我们现在主要有三种方式:

  1. 重写equals
  2. 实现compa方法rable接口并改写(重写)其compareTo方法
  3. 加入比较器,我们自己定义一个比较器类并实现comparor接口,重写compare方法,比较时创建比较器对象进行调用其compare方法即可。

那么下面我们就一一给大家演示一遍


重写equals

如下代码:

我们根据我们自己的想法,决定我们比较员工(Worker)的标准为工龄(workAge),只要工龄相等我们就直接判定其为相同的,那么我们就可以像下面这样子重写equals方法。我们也可以加上其它比较元素。

public class Worker {String name;int age;int workAge;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null ) return false;Worker worker = (Worker) o;return  workAge == worker.workAge;}public static void main(String[] args) {Worker t=new Worker();Worker t1=new Worker();Worker t2=new Worker();t.age=19;t.name="aaa";t.workAge=3;t1.age=19;t1.name="aaa";t1.workAge=2;t2.age=22;t2.name="ccc";t2.workAge=3;System.out.println(t.equals(t1));System.out.println(t.equals(t2));}}


实现comparable接口

正如上面所说那么我们首先要我们需要比较的对象实现comparable接口,在重写compareTo方法,那么下面就演示一下:

compareTo方法的返回值是int类型,其中返回值大于0则比较结果为大于,小于0则比较结果为小于,等于0则说明比较的两个对象相等。

public class Worker implements Comparable {String name;int age;int workAge;@Overridepublic int compareTo(Object o) {if (this == o) return 0;if (o == null ) return -1;Worker worker = (Worker) o;return  workAge - worker.workAge;}public static void main(String[] args) {Worker t=new Worker();Worker t1=new Worker();Worker t2=new Worker();t.age=19;t.name="aaa";t.workAge=3;t1.age=19;t1.name="aaa";t1.workAge=2;t2.age=22;t2.name="ccc";t2.workAge=3;if(t.compareTo(t1)>0){System.out.println("大于");}else if(t.compareTo(t1)<0){System.out.println("小于");}else {System.out.println("相等");}}}


加入比较器

如下代码我们定义了一个比较器的类ComWorker,然后重写了compare方法,然后在需要比较时,实例化一个比较器对象,然后调用其compare方法,即可。

public class Worker  {String name;int age;int workAge;public static void main(String[] args) {ComWorker c=new ComWorker();Worker t=new Worker();Worker t1=new Worker();Worker t2=new Worker();t.age=19;t.name="aaa";t.workAge=3;t1.age=19;t1.name="aaa";t1.workAge=2;t2.age=22;t2.name="ccc";t2.workAge=3;int n= c.compare(t,t1);if(n>0){System.out.println("大于");}else if(n<0){System.out.println("小于");}else {System.out.println("相等");}}}class ComWorker implements Comparator {@Overridepublic int compare(Object o1, Object o2) {if (o1==o2) return 0;Worker worke1 = (Worker) o1;Worker worker2 = (Worker) o2;return worke1.workAge-worker2.workAge;}}


  1. equals 方法
    • 用途:用于检查两个对象是否相等。
    • 场景:当你需要判断两个对象是否代表相同的数据或状态时,比如检查两个字符串是否包含相同的字符序列。
    • 实现:通常重写Object类的equals方法来定义对象相等的逻辑。
    • 因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与否

  1. Comparable 接口
    • 用途:用于定义对象的自然排序规则。
    • 场景:当你的对象需要按照某种自然顺序(如数字的大小、字符串的字典顺序)进行排序时,比如在集合类如TreeSetArrays.sort()中使用。
    • 实现:实现Comparable接口并重写compareTo方法。
    • 需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于 内部顺序
  1. Comparator 接口
    • 用途:用于定义对象的自定义排序规则。
    • 场景:当你需要按照非自然顺序(比如根据对象的某个属性)对对象进行排序时,比如在Collections.sort()Stream API中使用。
    • 实现:实现Comparator接口并定义compare方法。
    • 需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性

在Priority Queue中的形式

集合框架中的PriorityQueue底层使用堆结构,因此其内部的元素必须要能够比大小,PriorityQueue采用了:
Comparble和Comparator两种方式。

  1. Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接
    口,并覆写compareTo方法
  2. 用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现
    Comparator接口并覆写compare方法。

相关文章:

【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study 专栏&#xff1a;用Java学习数据结构系列 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff…...

快手视频怎么保存到相册?(详细操作)

随着短视频的流行&#xff0c;快手已经成为越来越多人日常生活的一部分。无论是搞笑片段、旅行记录&#xff0c;还是生活点滴&#xff0c;用户们每天都会在快手上浏览到大量有趣的视频。有时候&#xff0c;我们会遇到特别想保存的视频&#xff0c;想要分享到朋友圈&#xff0c;…...

为什么 ECB 模式不安全

我们先来简单了解下 ECB 模式是如何工作的 ECB 模式不涉及链接模式&#xff0c;所以也就用不着初始化向量&#xff0c;那么相同的明文分组就会被加密成相同的密文分组&#xff0c;而且每个分组运算都是独立的&#xff0c;这也就意味着可以并行提高运算效率&#xff0c;但也正是…...

『功能项目』事件中心处理怪物死亡【55】

本章项目成果展示 我们打开上一篇54回调函数处理死亡的项目&#xff0c; 本章要做的事情是用事件中心处理怪物死亡后的逻辑 首先打开之前事件中心脚本&#xff08;不做更改&#xff0c;调用即可&#xff09;&#xff1a; using System.Collections.Generic; using UnityEngine…...

一个安卓鸿蒙化工具

DevEco插件&#xff0c;为已有安卓项目鸿蒙化加速。 目前支持&#xff1a; 1、安卓Vector Assets转svg&#xff1b; 2、json转ets model&#xff1b; 3、kotlin model转ets model&#xff1b; 下载地址&#xff1a;andtoharplugin1.1.0 安装&#xff1a; deveco插件安装选硬…...

PyQt5库学习之QFileDialog.getExistingDirectory函数

PyQt5库学习之QFileDialog.getExistingDirectory函数 一、简介 QFileDialog.getExistingDirectory 是 PyQt5 中的一个函数&#xff0c;它提供了一个标准的目录选择对话框&#xff0c;允许用户选择一个已存在的目录。这个函数是 QFileDialog 类的一部分&#xff0c;通常用于打开…...

AUTOSAR_EXP_ARAComAPI的5章笔记(9)

☞ 返回总目录 5.4 骨架类&#xff08;Skeleton Class&#xff09; 骨架类是由AUTOSAR 元模型的服务接口描述&#xff08;SI description&#xff09;生成的。ara::com对生成的骨架类的接口进行了标准化。自适应平台&#xff08;AP&#xff09;产品供应商的工具链将生成一个完…...

京东-第2题-撞车

Powered by:NEFU AB-IN Link 文章目录 京东-第2题-撞车题意思路代码 京东-第2题-撞车 题意 一条单向单车道的道路上有n辆车&#xff0c;第i辆车位于 xi;&#xff0c;速度大小为 vi。 显然&#xff0c;如果车辆保持此速度行驶下去&#xff0c;在大多数情况下都会发生碰撞。 现…...

Vue3流程图插件-Vue Flow

1、安装&#xff1a;通过 npm 或 yarn 安装 Vue Flow。 npm install vueflow/core# 或者yarn add vueflow/core 2、引入&#xff1a;在你的 Vue 3 项目中引入 Vue Flow。 import { VueFlow, Background, Controls, MiniMap } from vueflow/core;3、使用&#xff1a;在 Vue…...

初始网络编程(下)

所属专栏&#xff1a;Java学习 1. TCP 的简单示例 同时&#xff0c;由于 TCP 是面向字节流的传输&#xff0c;所以说传输的基本单位是字节&#xff0c;接受发送都是使用的字节流 方法签名 方法说明 Socket accept() 开始监听指定端口&#xff08;创建时绑定的端口&…...

java计算机毕设课设—土地档案管理系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—土地档案管理系统(附源码、文章、相关截图、部署视频) 土地档案管理系统是一种将传统纸质档案进行数字化管理的软件。通过该系统&#xff0c;用户能够高效地进行土地档案的存储、查阅、修改和删除等操作…...

第4步CentOS配置SSH服务用SSH终端XShell等连接方便文件上传或其它操作

宿主机的VM安装CENTOS文件无法快速上传&#xff0c;也不方便输入命令行&#xff0c;用SSH终端xshell连接虚拟机的SSH工具就方便多了&#xff0c;实现VM所在宿主机Win10上的xshell能连接vm的centos要实现以下几个环节 1、确保宿主机与虚拟机的连通性。 2、虚拟机安装SSH服务&…...

Spring:统一结果私有属性造成的前端无法访问异常报错问题

用户未填写任何评价 1.问题复现 &#xff08;1&#xff09;看一段代码 controller&#xff1a; import lombok.extern.slf4j.Slf4j; import org.ljy.testdemo.common.Result; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.w…...

thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表&#xff08;分区&#xff09; 引言 thinkphp* 大道至简一、分库分表分表php 分库分表hash算法0、分表的方法&#xff08;thinkphp&#xff09;1、ThinkPHP6 业务分表之一&#xff1a;UID 发号器2、ThinkPHP6 业务分表之二&#xff1a;用…...

webpack的使用

将js读取的目录改成读内存中的main.js&#xff0c;否则不会生效 为了 将index.html在打开首页的时候就能自动显示&#xff0c;就需要引入插件 指定开发环境运行的命令&#xff1a; dev&#xff1a;开发环境&#xff0c;build生产环境...

MATLAB智能优化算法-学习笔记(3)——大规模邻域搜索算法求解旅行商问题【过程+代码】

一、问题描述 旅行商问题(TSP, Traveling Salesman Problem)是组合优化中的经典问题之一。给定一组城市和每对城市之间的距离,要求找到一条最短的路径,使旅行商从某个城市出发,访问每个城市一次并最终回到出发点。TSP问题广泛应用于物流配送、工厂调度、芯片制造等领域。…...

货币单位换算 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;E卷D卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 记账本上记录了若干条多国货币金额&#xff0c;需要转换成人民币分(fen)&#xff0c;汇总后输出。 每行记录一条金额&#xff0c;金额带有货币单位&#xff0c;格式为数字单位&…...

95、k8s之rancher可视化

一、ranker 图形化界面 图形化界面进行k8s集群的管理 rancher自带监控----普罗米修斯 [rootmaster01 opt]# docker load -i rancher.tar ##所有节点 [rootmaster01 opt]# docker pull rancher/rancher:v2.5.7 ##主节点[rootmaster01 opt]# vim /etc/docker/daemon.jso…...

简单生活的快乐

小明经常会被问到一个问题&#xff1a;为什么他那么有钱却选择过一种简单、谦逊的生活。先从小明的早年经历说起吧&#xff0c;大概是他六到十三岁的时候&#xff0c;物质对他来说是非常重要的。他记得当妈妈给他买了一双昂贵的鞋子时&#xff0c;他特别兴奋&#xff0c;喜欢向…...

【JAVA开源】基于Vue和SpringBoot的在线文档管理系统

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...