我想知道我是否有可能在PriorityQueue中找到值的索引。只是看看它是“在线”的数字。有谁知道吗?
答案 0 :(得分:4)
普林斯顿有一个索引优先级队列。
algs4.cs.princeton.edu/24pq/IndexMinPQ.java.html
关键思想是在项目及其在优先级队列中的位置之间建立两个索引映射。
更新优先级队列时,还需要更新这两个索引映射。
希望这能解决您的问题: - )
答案 1 :(得分:2)
如果您查看文档中的第一行,您会看到:
An unbounded priority queue based on a priority heap.
您无法使用优先级堆来有效地查找元素的索引。它只知道第一个,当你弹出它然后重新计算新的第一个等。
答案 2 :(得分:2)
PriorityQueue不支持索引。您可以自己将整数索引与每个项目相关联。
答案 3 :(得分:0)
我有一个PriorityQueue<Integer[]> queue
,其中索引是数组的第一个元素。因此,我执行了此方法,在该方法中找到元素,然后将其实际上从队列中删除。
由于此方法仅用于现有索引,因此我添加了orElseThrow
来处理空的Optional
。
static Integer[] getByIndex(Integer i, PriorityQueue<Integer[]> queue) {
Integer[] node = queue.stream().filter(n -> n[0].equals(i)).findAny().orElseThrow(
() -> new NullPointerException("node " + i + " not found on queue")
);
queue.remove(node);
return node;
}
答案 4 :(得分:0)
这是一个快速修复; 更好的方法是李明提交的方法。
这个问题可以使用 poll()
和 peek()
方法解决:
poll()
方法检索最顶层的元素并将其删除。
假设您要检查名为 PriorityQueue
的 pq
中的第 k 个元素:
for(int i=0; i<k-1; i++){
pq.poll();
}
接下来,我们使用 peek()
方法查看 PriorityQueue
的最顶层元素:
pq.peek();
这将返回 PriorityQueue
的最顶层元素,在本例中将是第 k 个位置的元素。