The Iterator provided in method iterator() is not guaranteed to traverse the elements of the PriorityQueue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray()).
PriorityQueue<Your_class> pqCopy = new PriorityQueue<Your_class>(pq);
while(!pqCopy.isEmpty()){
Your_Class obj = pqCopy.poll();
// obj is the next ordered item in the queue
.....
}
# 4 楼答案
以前的海报上说,除了noone之外,其他人都给出了完整的工作示例(除了复制pq),所以这里是:
Event[] events = pq.toArray(new Event[pq.size()]);
Arrays.sort(events, pq.comparator());
for (Event e : events) {
System.out.println(e);
}
Queue<String> newQueue = new PriorityQueue<String>();
// Assuming that oldQueue have some data in it.
Iterator<String> itr = oldQueue.iterator();
while(itr.hasNext()){
String str = oldQueue.poll();
// do some processing with str
if(strNotUsed){
newQueue.offer(str);
}
}
# 1 楼答案
从Javadocs
可能还有其他类似的机制
# 2 楼答案
基于堆的优先级队列只保证第一个元素是最高/最低的。没有廉价的(即O(n))方法来获得排序形式的元素
如果您需要经常这样做,请考虑使用以排序形式维护元素的结构。例如,使用} 或
java.util.TreeSet
,并使用^{pollLast()
代替peek()
/poll()
# 3 楼答案
您可以复制队列并在循环中轮询,在本例中,pq是原始优先级队列:
# 4 楼答案
以前的海报上说,除了noone之外,其他人都给出了完整的工作示例(除了复制pq),所以这里是:
# 5 楼答案
最近,我也有同样的问题。我想使用优先级队列中的某个特定对象,然后保留其余元素
1)我创建了一个newPriorityQueue。 2) 使用迭代器分析oldQueue中的每个元素 3) 使用旧队列。poll()方法来检索元素 4) 如果未使用,请将元素3)插入newPriorityQueue
最后,oldQueue将是空的。 @其他:-如果我能做同样的事情,请建议一个更好的方法。我不能使用迭代器,因为它没有以正确的顺序返回元素
# 6 楼答案
由于底层的实现(我认为它是Java中的最小堆),所以不能按该顺序遍历
Priority Queue
它不是一个排序数组,因此您可以从一个元素转到优先级较低的元素
窥视(读取堆中的顶部元素堆)是恒定时间
O(1)
,因为它查看最小的元素要获得下一个元素,您必须将最小的顶层元素出列,这就是它的工作方式
Dequeing(re-heapify=
O(log n)
time)不仅仅是将该元素取出的问题,底层结构会重新安排自身,以便将优先级最低的元素放在第一位此外,要遍历整个优先级队列以按排序顺序读取所有项目,这是一个
O(n log(n))
操作因此,您也可以抓取队列中的所有元素并对它们进行排序(也是
O(n log (n))
),然后您可以根据自己的意愿对它们进行检查。唯一的缺点是您持有队列的额外副本尽管如此,如果您需要以这种方式遍历数据,优先级队列可能不是适合您需要的正确数据结构