删除元素时PriorityQueue更改顺序

绿茶杯

在不提供自定义比较器的情况下,优先级队列按升序插入元素,但是,在删除特定元素之后,顺序会更改。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PriorityQueue.toString元素顺序错误

来自分类Dev

是否可以从PriorityQueue中删除元素?

来自分类Dev

更改PriorityQueue中元素的优先级

来自分类Dev

屏幕宽度更改属性时CSS的元素排列顺序

来自分类Dev

从DOM中删除元素时的过渡位置更改

来自分类Dev

更改数据集时未从ListView中删除元素

来自分类Dev

当删除多个元素的特定类时更改innerHTML

来自分类Dev

以任何顺序删除img元素

来自分类Dev

bxSlider:更改li元素的顺序

来自分类Dev

XSLT更改XML元素顺序

来自分类Dev

在不更改元素顺序的情况下删除数组中的重复项

来自分类Dev

悬停时更改元素样式,但悬停时不删除元素样式

来自分类Dev

Python PriorityQueue顺序

来自分类Dev

jQuery-删除html元素时重新格式化数字顺序

来自分类Dev

Angular2 NgFor内部树模型:删除然后添加元素时顺序错误

来自分类Dev

删除jquery按顺序创建的元素

来自分类Dev

如何使用Jquery更改列表元素的顺序?

来自分类Dev

更改re.findall找到的元素的顺序

来自分类Dev

使用绝对定位更改元素的顺序

来自分类Dev

更改R中向量中元素的顺序

来自分类Dev

根据屏幕大小更改元素的顺序

来自分类Dev

更改DIV标签内的元素顺序

来自分类Dev

更改列表的初始元素,保持顺序

来自分类Dev

使用CSS更改HTML元素的顺序

来自分类Dev

如何使用Jquery更改列表元素的顺序?

来自分类Dev

SilverStripe:更改GridField输入元素的顺序

来自分类Dev

根据屏幕大小更改元素的顺序

来自分类Dev

如何更改JS中的子元素顺序?

来自分类Dev

更改网格视图中元素的顺序