具有比较器的优先级队列未按预期工作

Posted

技术标签:

【中文标题】具有比较器的优先级队列未按预期工作【英文标题】:Priority Queue with Comparator not working as expected 【发布时间】:2018-01-09 15:13:02 【问题描述】:

优先队列没有按照比较器的顺序工作。

See code snippet

输出: [蒂姆,5 岁],[乔,12 岁],[爱丽丝,7 岁]

预期: [蒂姆,5 岁],[爱丽丝,7 岁],[乔,12 岁]

谁能帮助我为什么比较器没有给出预期的输出。

【问题讨论】:

PriorityQueue的迭代器“不按任何特定顺序返回元素” 寻求调试帮助的问题必须包含所需的行为、特定问题或错误,以及在问题本身中重现它所需的最短代码。见What topics can I ask about here? 【参考方案1】:

来自Java docs:

方法PriorityQueue.iterator()中提供的迭代器不是 保证遍历任何优先级队列的元素 特定的顺序。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())

【讨论】:

【参考方案2】:

PriorityQueue 是一个队列,它不会即时对值进行排序。您需要使用 PriorityQueue.poll 方法来按顺序获取对象。

static class Student 
    String name;
    int roll;

    public Student(String name, int roll) 
        this.name = name;
        this.roll = roll;
    

    @Override
    public String toString() 
        return "["+ name +","+roll+"]";
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getRoll() 
        return roll;
    

    public void setRoll(int roll) 
        this.roll = roll;
    


public static void main(String[] args) 

    Comparator<Student> byRoll = Comparator.comparing(Student::getRoll);

    PriorityQueue<Student> pq = new PriorityQueue<>(byRoll);

    pq.add(new Student("Tim", 5));
    pq.add(new Student("Joe", 12));
    pq.add(new Student("Alice", 7));

    while(!pq.isEmpty()) 
        System.out.println( pq.poll().toString());
    


【讨论】:

【参考方案3】:

您的代码非常好,无需更改 Comparator 或 Array.sort 或添加 getter/setter 等。 只需将您的打印声明更改如下:

while(!pq.isEmpty()) 
        System.out.println(pq.poll().toString());
    

希望这会有所帮助。

【讨论】:

以上是关于具有比较器的优先级队列未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

优先队列未按正确顺序排序

具有自定义比较器的最小优先级队列

优先级队列未正确比较 C++

具有自定义比较功能的 C++ 优先级队列在 Push() 上行为不正确

Azure NSG 未按预期工作

在优先级队列中,优先级是比较器还是可比较器的自然顺序?