我有一个类似这样的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]
答案 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