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

时间:2018-01-09 15:13:03

标签: java priority-queue

优先级队列不按照比较器的顺序工作。

See code snippet

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

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

任何人都可以帮助我为什么比较器没有给出预期的输出。

3 个答案:

答案 0 :(得分:0)

来自Java docs

  

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

答案 1 :(得分:0)

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());
    }

}

答案 2 :(得分:0)

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

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

希望这有帮助。