Java:优先级队列

时间:2011-10-28 09:06:41

标签: java collections priority-queue

我有一个类似这样的java程序

公共类PriorityQueueExample {

public static void main(String[] args) {
    PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
    pq.add(10);
    pq.add(1);
    pq.add(9);
    pq.add(2);
    pq.add(8);
    pq.add(3);
    pq.add(7);
    pq.add(4);
    pq.add(6);
    pq.add(5);
System.out.println(pq);

}

}

我的问题是为什么优先级队列不对它们进行排序。根据java规范,它实现了可比较并维护排序顺序(自然排序)

我的节目输出如下:[1,2,3,4,5,9,7,10,6,8]

3 个答案:

答案 0 :(得分:7)

插入优先级队列不足以对元素列表进行排序,因为它不按排序顺序存储它们;它将它们存储在部分排序的堆顺序中。您必须删除循环中的元素才能对它们进行排序:

while (pq.size() > 0)
    System.out.println(pq.remove());

答案 1 :(得分:7)

它已排序,但内部元素存储在中。如果您致电peek()poll()remove(),您将获得正确的订单(这就是您访问队列的方式)。

答案 2 :(得分:0)

poll()和remove()将给出排序顺序,而不是按照Java8的peek()。

 PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
    pq.add(10);
    pq.add(1);
    pq.add(9);
    pq.add(2);
    pq.add(8);
    pq.add(3);
    pq.add(7);
    pq.add(4);
    pq.add(6);
    pq.add(5);
        // Remove items from the Priority Queue (DEQUEUE)
        while (!pq.isEmpty()) {
          //  System.out.println(pq.remove());
          System.out.println(pq.poll());
        }
Output for poll() & remove():
1 
2
3 
4 
5 
6 
7 
8 
9 
10
output for peek():
1
1
1
1
1
1
1
1
1
1