PriorityQueue按两个值排序

时间:2015-08-20 13:05:06

标签: java

我有一个包含患者的优先级队列:

patientQueue.add(new Patient(idNr, name, emergencyNr));

现在我想首先通过emergencyNr然后再使用idNr对队列进行排序。 “名字”无关紧要。

现在,我可以对患者实施的优先级队列进行排序:

    @Override
    public int compareTo(Patient otherRequest) {
        return Integer.compare(isEmergencyCase(), otherRequest.isEmergencyCase());
    }

如何实现同样按IdNr排序的方法? 因此,如果所有EmergencyNr都是等于那么最低的idNr将是第一个。

先谢谢你们!

2 个答案:

答案 0 :(得分:3)

只需在compareTo()中添加其他条件:

@Override
public int compareTo(Patient otherRequest) {
    int r = Integer.compare(emergencyNr, otherRequest.emergencyNr);
    return r == 0 ? Integer.compare(idNr, otherRequest.idNr) : r;
}

或使用接受Comparator的构造函数,例如:

Queue<Patient> q 
    = new PriorityQueue<>(CAPACITY, Comparator.comparing(Patient::getEmegencyNr)
                                              .thenComparing(Patient::getIdNr));

P上。 S.要检查正确性,请使用poll()而不是直接打印队列内容:

Patient p;
while((p = q.poll()) != null) 
    System.out.println(p);

答案 1 :(得分:0)

Hava看一下https://stackoverflow.com/a/683049/197574

使用构造函数public PriorityQueue(int initialCapacity, Comparator comparator)

你的Coparator应该包含这样的东西

if (this.emergency != other.emergency)
    return other.emergency - this.emergency
else
    return other.id - this.id