当前位置: 首页 > 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方法。


http://www.mrgr.cn/news/31112.html

相关文章:

  • 鸿蒙手势交互(三:组合手势)
  • 模型案例:| 篮球识别模型
  • Python学习——【3.1】函数
  • 超详细!百分百安装成功pytorch,建议收藏
  • 【Node.js Vue】还在为选什么乐器发愁?乐器推荐系统帮你解决难题,基于用户行为分析的智能推荐,让你不再为音乐器材烦恼
  • 监控易监测对象及指标之:全面监控GBase数据库
  • NAT和代理服务
  • 基于google.protobuf的python接口解析proto
  • 2024 中秋盛景:数据璀璨,文旅辉煌
  • 【前端】--- ES6上篇(带你深入了解ES6语法)
  • Web+Mysql——MyBatis
  • HarmonyOS鸿蒙开发实战(5.0)网格元素拖动交换案例实践
  • 在 PyCharm 中配置 Anaconda 环境
  • 江科大51单片机
  • VD2811A SOP-8封装 可直接替代XB8886G芯片 大电流充放电锂保芯片
  • 怎样的数据治理状态才能被视为是良性发展的呢?
  • JVM原理-类加载过程
  • c++类和对象(6个默认成员函数)第二级中阶
  • MySQL的缓存策略
  • ssh 免密登陆服务器故障