我不明白compareTo()方法和equals()方法.它们如何在下面的代码中工作?请为我描述一下,并在方法下查看我的评论.
我不明白它是如何打印出根据每个患者的先后顺序订购的患者的.帮助将不胜感激.
import java.util.PriorityQueue;
public class Patient implements Comparable {
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 pq = new PriorityQueue();
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]
解决方法:
equals()方法用于比较该类的两个实例是否相等.它来自java的Object类. 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()方法是基于该类的数量和优先级属性定义的.当当前实例小于然后分别传递时,compareTo()返回负数,零或正数,等于或更大.
public boolean equals(Object rhs) {
if (rhs instanceof Patient) { // First Line
return compareTo((Patient) rhs) == 0; // Second Line
} else {
return false;
}
}
在第一行中,您正在检查传递给方法的参数是否为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具有最高优先级(最小值),但是Kalle的数量低于Kallee.其他人则由prio组织.
标签:java
来源: https://codeday.me/bug/20191119/2034583.html