【发布时间】:2017-01-26 10:45:04
【问题描述】:
我有一个包含患者姓名和紧急级别的类,可实现可比性:
class Patient implements Comparable<Patient>{
private String name;
private int emergencyLvl;
public Patient(String name, int emergencyLvl)
{
this.name = name;
this.emergencyLvl = emergencyLvl;
}
public String getName(){
return this.name;
}
public int getEmergencyLvl(){
return this.emergencyLvl;
}
public void setEmergencyLvl(int updateLvl){
this.emergencyLvl = updateLvl;
}
public void setName(String newName){
this.name = newName;
}
public int compareTo(Patient p){
int compareEmergency = ((Patient) p).getEmergencyLvl();
return compareEmergency - this.emergencyLvl;
**//I believe my error comes from here**
}
}
**假设这是我的输入文件:
3
0 david 30
0 may 60
1 david 30
2
*3 = 查询数,0 = 新患者添加到数组列表中,1 = 更新紧急级别(例如 30 + 30 = 60)。 2 = 从降序和名称打印紧急级别。**
但是,我的程序成功地扫描并正确地将新患者添加到数组列表中,但是每当需要更新紧急级别时,顺序都是错误的。
例如更新david紧急级别之前。顺序是(may 60, david 30) 但是在更新大卫紧急级别后,因为大卫首先到达,所以可能正确的顺序应该是(大卫 60,5 月 60)。
很遗憾,我未能正确更新序列。 这是我的主程序:
UpdateEmergencyLvl:
void UpdateEmergencyLvl(String patientName, int incEmergencyLvl) {
for(Patient p: a1){
if(p.getName().equals(patientName)){
int newEmergencyLvl = p.getEmergencyLvl() +
incEmergencyLvl;
p.setEmergencyLvl(newEmergencyLvl);
}
}
Collections.sort(a1);
}
【问题讨论】:
-
无需在 compareTo 中将 p 转换为 Patient - 根据方法签名,它已经是 Patient
-
是的,但这并不能解决我的问题,因为我想让首先进入的患者的顺序正确。因为在我的情况下,大卫是第一位的,但后来更新了紧急情况。但是,更新后的紧急级别与 5 月相同。但大卫先来,所以大卫应该先打印出来,而不是五月。
-
也许添加一个到达索引可以避免这个问题。例如,获取输入文件的行作为索引。
-
当 compareTo 返回 0 时,比较的两个元素的顺序保持不变。 - Collections.sort(List>)
This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort. -
如果使用bufferedReader添加行,只需在bucle之前创建一个int,例如int index=0用于读取行,并在读取bucle中的每一行后执行index ++,然后将该索引添加到您对患者使用的信息中,添加一个新属性,例如,您有姓名和紧急状态,您可以添加一个新的arrivalIndx 属性来存储它。
标签: java sorting arraylist collections