Java 在本例中,compareTo和equals方法是如何工作的?

Java 在本例中,compareTo和equals方法是如何工作的?,java,Java,我不理解compareTo()方法和equals()方法。在下面的代码中它们是如何工作的?请给我描述一下,看看我在方法下的评论 我不明白它是如何为每个患者打印根据prio订购的患者的。我们将不胜感激 import java.util.PriorityQueue; public class Patient implements Comparable<Patient> { private String firstname; private String lastna

我不理解
compareTo()
方法和
equals()
方法。在下面的代码中它们是如何工作的?请给我描述一下,看看我在方法下的评论

我不明白它是如何为每个患者打印根据
prio
订购的患者的。我们将不胜感激

 import java.util.PriorityQueue;

public class Patient implements Comparable<Patient>  {
    private String firstname;
    private String lastname;
    private String personNbr;
    private int prio;
    private int number;
    private static int total = 0;

    public Patient(String firstname, String lastname, String personNbr, int prio) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.personNbr = personNbr;
        this.prio = prio;
        total++;
        number = total;

    }

    public int compareTo(Patient rhs) {
        if(prio==rhs.prio) {
            return number - rhs.number; // what happens here?
        } else {
            return prio - rhs.prio; // what happens here?
        }
        }

    public boolean equals(Object rhs) {
        if (rhs instanceof Patient) {  // what happens here?
        return compareTo((Patient) rhs) == 0; // what happens here?
        } else {
        return false;
        }
        }

    public String toString() {
        return this.firstname + this.lastname + this.personNbr + this.prio;

    }

    public static void main(String[] args) {

        PriorityQueue<Patient> pq = new PriorityQueue<Patient>();
        pq.offer(new Patient("Kalle", "Karlsson", "8503622-1213", 3));
        pq.offer(new Patient("Lisa", "Svensson", "840312-1224", 7));
        pq.offer(new Patient("Lena", "Nilsson", "820323-1224", 9));
        pq.offer(new Patient("Kallee", "Karlssonn", "85503622-1213", 3));

        System.out.println(pq.toString());
    }

    }

conmpareTo
方法定义了一种排序方式,即首先对
prio
字段进行排序,然后对
number
字段进行排序。如果
prio
字段相等,则差值来自
number
字段。如果
prio
不相等,则比较的是
prio
字段

equals
方法声明,如果
compareTo
返回零,则两个对象是相等的。仔细想想,这是有道理的。

equals()
方法用于比较类的两个实例是否相等。它来自java的
Object
类。java中的所有类都有equals()方法可供比较。您始终可以根据类成员和相等定义提供自定义实现

主集合框架使用
compareTo()
对数组排序或对优先级队列中的元素排序
compareTo()
来自
Comparable
接口


compareTo()
方法是基于类的
number
prio
属性定义的。
compareTo()
当当前实例较小时,返回负、零或正,然后分别传递、相等或更大


在第一行中,您检查传递给方法的参数是否为
Patient
类的实例。因为您正在检查两个应为相同类型的实例的相等性

第二行,使用
compareTo()
方法定义实例的相等性


问题的最新情况:

下面是
toString()
方法

@Override
public String toString() {
  return
      "firstname='" + firstname  +
      " lastname='" + lastname +
      " personNbr='" + personNbr +
      " prio=" + prio +
      " number=" + number;
}
您需要
poll()
而不仅仅是打印它们
poll()
检索并删除此队列的头。这将表示队列中元素的真实顺序,而不是
toString()

输出:

firstname='Kalle lastname='Karlsson personNbr='8503622-1213 prio=3 number=1
firstname='Kallee lastname='Karlssonn personNbr='85503622-1213 prio=3 number=4
firstname='Lisa lastname='Svensson personNbr='840312-1224 prio=7 number=2
firstname='Lena lastname='Nilsson personNbr='820323-1224 prio=9 number=3
分析:


Kalle
Kallee
具有最高优先级(最小值),但
Kalle
number
低于
Kallee
。其他的是由
prio组织的

您是否阅读了javadoc for and?谢谢。。PriorityQueue如何知道当代码到达
时返回prio-rhs.prio因此,如果它是4-3=1==>则将其放入优先级队列号的第一个索引中。返回的值不确定队列中的确切位置。基于优先级堆的无限优先级队列。优先级队列的元素根据其自然顺序排序,或由队列构造时提供的比较器排序。这里的
prio
rhs.prio
大,所以
rhs.prio
将排在队列的第一位。如果你想在其他战争回合中使用它,那么否定结果。什么决定了队列中的确切位置?代码中是否存在决定它的因素?谢谢你可以在链接中找到更多关于java的信息
if(prio==rhs.prio){}
代码如何知道
rhs.prio
的值与
rhs
不同。。。我的意思是,我们不使用例如
rhs.prio.next
!!谢谢,谢谢。。PriorityQueue如何知道当代码到达
时返回prio-rhs.prio所以如果它是4-3=1==>那么它被放在优先级队列的第一个索引中
public boolean equals(Object rhs) {
    if (rhs instanceof Patient) {  // First Line
      return compareTo((Patient) rhs) == 0; // Second Line
    } else {
      return false;
    }
 }
@Override
public String toString() {
  return
      "firstname='" + firstname  +
      " lastname='" + lastname +
      " personNbr='" + personNbr +
      " prio=" + prio +
      " number=" + number;
}
while (!pq.isEmpty()) {
  System.out.println(pq.poll());
}
firstname='Kalle lastname='Karlsson personNbr='8503622-1213 prio=3 number=1
firstname='Kallee lastname='Karlssonn personNbr='85503622-1213 prio=3 number=4
firstname='Lisa lastname='Svensson personNbr='840312-1224 prio=7 number=2
firstname='Lena lastname='Nilsson personNbr='820323-1224 prio=9 number=3