在不提供自定义比较器的情况下,优先级队列按升序插入元素,但是,在删除特定元素之后,顺序会更改。
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.add(10);
pq.add(1);
pq.add(2);
pq.add(2);
pq.remove(2);
for(int x: pq) {
System.out.println(x);
}
//outputs: 1 10 2, instead of expected: 1 2 10
有任何想法吗?
谢谢。
不要PriorityQueue<T>
像在集合/数组上那样反复进行迭代;使用.poll()
,而不是:
while(pq.peek()!=null) {
System.out.println(pq.poll());
}
Priority Queue是一种抽象数据类型,通常实现为Binary Heap数据结构,而该结构又(通常)与数组一起实现。还有其他一些方法可以实现二进制堆,但是普通数组是最快,最简单和最好的方法。
您的情况下,队列顺序未更改;相反,您只是以一种错误的方式利用了数据结构,仅以传统的for-each
/迭代的方式对其进行了迭代,就像您在基本数组上进行迭代时,没有考虑到优先级队列支持数组未使用其i进行排序个索引; 而是将顶部元素保留在树的顶部(最小堆或最大堆的情况),您不能仅仅.poll()
通过以传统方式对其进行迭代来获得效果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句