java - 删除元素时 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());
}
优先级队列是一种抽象数据类型,通常实现为二进制堆数据结构,而二进制堆数据结构又(通常)用数组实现。 实现二进制堆还有其他一些方法,但普通数组是最快、最简单、最好的方法。
就您而言,队列顺序没有改变;相反,您只是以错误的方式使用数据结构,仅以传统的for-each
/iterative 方式对其进行迭代,就像您在基本数组上进行迭代时一样,不考虑您的 Priority Queue 后备数组未按其 i 排序指数;相反,它维护树顶部的顶部元素(Min Heap 或 Max Heap 情况),您不能仅.poll()
通过以传统方式对其进行迭代来获得效果。
推荐阅读
- javascript - React - 选择具有与 HTML5 选择元素类似的 API 的组件
- javascript - 在 IE 中添加/删除选择列表选项
- acumatica - 从 PO 订单行到 ReceiptLine 的承诺日期
- python - 识别连续重复的子序列数组
- angularjs - 作为 DOM 兄弟的指令元素
- uiscrollview - Swift 4:centerXAnchor 和 centerYAnchor 自动约束不将 UIView 在视图中心居中的问题
- azure - Azure DevOps 中的多个 YAML 构建管道
- go - Golang GORM 有很多关系
- python - 自定义 matplotlib 偏移中的移位
- python - 使用 Python 登录网站和网页抓取