问题描述
当我在 PriorityQueue 中添加一些随机数时,当我打印 PriorityQueue 时,元素以不同的顺序打印。
这是怎么回事?
示例
PriorityQueue<Integer> s=new PriorityQueue<Integer>();
s.add(22);
s.add(212);
s.add(423);
s.add(323);
s.add(1);
System.out.print(s);
output:
[1,22,423,323,212]
解决方法
它没有保证顺序(https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html):
方法Iterator
中提供的iterator()
和方法Spliterator
中提供的spliterator()
不能保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())
。
通常,您使用 poll()
方法根据元素的自然顺序检索元素,例如:
while (!pq.isEmpty()) {
var element = pq.poll();
...
}
,
toString()
返回优先级队列内部存储的表示,而不是元素的逻辑顺序。 toArray()
和迭代也是如此:这些方法都不能保证元素将按其优先级顺序返回。
如果要按优先级顺序获取元素,则需要单独poll()
它们(从而销毁队列)。因此,如果您想以特定顺序列出元素,PriorityQueue
不是合适的数据结构。 SortedSet
在这里更合适。相比之下,队列数据结构(其中 PriorityQueue
是一个特例)用于接收和检索元素一次,而不是用于检查静态数据。