我不理解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());
}
}
输出
[KalleKarlsson8503622-12133, KalleeKarlssonn85503622-12133, LenaNilsson820323-12249, LisaSvensson840312-12247]
答案 0 :(得分:3)
equals()
方法用于比较类的两个实例是否相等。它来自Object
类java。 java中的所有类都有equals()方法可供比较。您始终可以根据类成员和等式定义提供自定义实现。
Collections框架主要使用compareTo()
来排序数组或对优先级队列中的元素进行排序。 compareTo()
来自Comparable
界面。
public int compareTo(Patient rhs) {
if(prio==rhs.prio) {
return number - rhs.number; // First line
} else {
return prio - rhs.prio; // Second line
}
}
compareTo()
方法是根据类的number
和prio
属性定义的。当前实例较小然后分别通过,等于或更大时,compareTo()
返回负数,零或正数。
public boolean equals(Object rhs) {
if (rhs instanceof Patient) { // First Line
return compareTo((Patient) rhs) == 0; // Second Line
} else {
return false;
}
}
在第一行中,您正在检查传递给method的参数是Patient
类的实例。因为您正在检查两个实例应该是相同类型的相等性。
第二行,您正在使用compareTo()
方法来定义实例的相等性。
问题更新:
以下是toString()
方法。
@Override
public String toString() {
return
"firstname='" + firstname +
" lastname='" + lastname +
" personNbr='" + personNbr +
" prio=" + prio +
" number=" + number;
}
您需要poll()
而不是仅打印它们。 poll()
检索并删除此队列的头部。这将代表队列中元素的真实顺序,而不是toString()
。
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
分析:
Kalle
和Kallee
具有最高优先级(最低值),但number
的{{1}}低于Kalle
。其他人由Kallee
组织。
答案 1 :(得分:0)
conmpareTo
方法定义了一个排序,以便首先排序prio
字段,然后排序number
字段。如果prio
字段相等,则差异来自number
字段。如果prio
不相等,那么它就是被比较的prio
字段。
equals
方法声明如果compareTo
返回零,则两个对象相等 - 如果您考虑它,这是有意义的。