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