更改 PriorityQueue 中元素的优先级

Changing the priority of an element in a PriorityQueue

我知道 PriorityQueue 使用对象的 compareTo() 方法 add() 时会自动对元素进行排序。假设我想在某个时候更改队列中某个元素的优先级。鉴于元素的优先级已更改,我如何明确命令 PriorityQueue 再次对自身进行排序?

删除对象,更改其优先级,然后将其重新添加到队列中。

我的直觉是数据结构通常不会观察对象的内部状态,它需要 add() 或 remove() 操作来触发比较器的重新调用。调用 Collections.sort() 也可以,但您必须将队列转换为列表,然后再转换回队列。如果您一次更改很多优先级,这可能更有意义。

更好的是,您可以更新 n 个优先级,然后添加和删除最后一个。

唯一的选择是删除、修改并重新添加您的对象。 PriorityQueue 不会在读取时更新其内部结构。例如,这是 peek() 的实现:

public E peek() {
    if (size == 0)
        return null;
    return (E) queue[0];
}

如您所见,不检查元素顺序是否已更改。