【用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;

    @Override
    public 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;

    @Override
    public 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 {


     @Override
     public 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方法。
相关推荐
码流之上11 分钟前
【一看就会一写就废 指间算法】设计电子表格 —— 哈希表、字符串处理
javascript·算法
快手技术2 小时前
快手提出端到端生成式搜索框架 OneSearch,让搜索“一步到位”!
算法
CoovallyAIHub1 天前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP1 天前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo1 天前
半开区间和开区间的两个二分模版
算法
moonlifesudo1 天前
300:最长递增子序列
算法
CoovallyAIHub1 天前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI2 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v2 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法