Java PriorityQueue包括..poll()和可比较的解释?(爪哇)

Java PriorityQueue包括..poll()和可比较的解释?(爪哇),java,priority-queue,Java,Priority Queue,我目前遇到以下问题: 我有一个班级等候室和一个病人。处于紧急状态的患者排在队列的第一位。队列等候室时间无关紧要,其他患者按预约时间排序 我正在用以下代码测试我的程序: WaitingRoom wz = new WaitingRoom(); Calendar c = Calendar.getInstance(Locale.GERMANY); c.set(2009, Calendar.OCTOBER, 21, 9, 35); wz.comesIn(new Patien

我目前遇到以下问题:

我有一个班级等候室和一个病人。处于紧急状态的患者排在队列的第一位。队列等候室时间无关紧要,其他患者按预约时间排序

我正在用以下代码测试我的程序:

    WaitingRoom wz = new WaitingRoom();
    Calendar c = Calendar.getInstance(Locale.GERMANY);
    c.set(2009, Calendar.OCTOBER, 21, 9, 35);
    wz.comesIn(new Patient("Smith Jones", c.getTime(), false));
    c.set(2009, Calendar.OCTOBER, 21, 9, 30);
    wz.comesIn(new Patient("Mueller Johan", c.getTime(), false));
    wz.comesIn(new Patient("Emergency Brooklyn", new Date(), true));
    c.set(2009, Calendar.OCTOBER, 21, 8, 30);
    wz.comesIn(new Patient("Richard Smith", c.getTime(), false));
    c.set(2009, Calendar.OCTOBER, 21, 9, 31);
    wz.comesIn(new Patient("Kimberly Adams", c.getTime(), false));
    c.set(2009, Calendar.OCTOBER, 21, 9, 29);
    wz.comesIn(new Patient("Random Name", c.getTime(), false));
    Patient patient = wz.getNextPatient();
    assertEquals("Emergency Brooklyn", patient.getName());
    patient = wz.getNextPatient();
    assertEquals("Richard Smith", patient.getName());
    patient = wz.getNextPatient();
    assertEquals("Random Name", patient.getName());
getNextPatient方法返回waitingRoom.poll; 我的比较:

public int compareTo(Patient other) {
    if (other.emergency) {
        return 1;
    } else {
        if (this.emergency) {
            return -1;
        } else {
            return this.appointment.compareTo(other.appointment);
        }
    }
}
代码运行良好。但我不明白分拣是如何工作的。我试图通过使用调试器来理解它。。但我还是不明白。当下一位患者进来时,它会对其进行排序。它如何选择另一位患者?还有一次当我使用函数.poll时

你能给我解释一下它是怎么工作的吗


提前谢谢

它是偶然工作的。你的比较器不尊重比较器的契约:如果患者A和B都处于紧急状态,A.compareToB返回1,因此A大于B,但B.compareToA也返回1,因此现在B大于A。如果两者都处于紧急状态,则应按预约进行比较。也就是说,我不明白你的问题。这是因为PriorityQueue使用比较器按照比较器定义的顺序返回患者。这是我们班的合同。它如何做到这一点很有趣,因为它使用了一个堆,但与此无关。请看源代码。谢谢你的回答。问题是,实际的第一个病人没有紧急情况是在最后添加看到测试。。。compareTo只比较两个值,不遍历所有患者检查他们的预约,将患者添加到正确的位置,这让我感到困惑。PriorityQueue不使用列表存储其元素。它使用堆。原因恰恰是它比使用列表更快,因为在队列中插入元素所需的比较更少。。。非常感谢你!源代码位于。