【发布时间】:2015-05-23 20:27:39
【问题描述】:
我知道PriorityQueue 使用对象的compareTo() 方法在add()ing 时自动对元素进行排序。假设我想在某个时候更改队列中元素的优先级。鉴于元素的优先级已更改,我如何明确命令 PriorityQueue 再次对其自身进行排序?
【问题讨论】:
-
移除元素,更改其优先级值,重新添加。
标签: java queue priority-queue
我知道PriorityQueue 使用对象的compareTo() 方法在add()ing 时自动对元素进行排序。假设我想在某个时候更改队列中元素的优先级。鉴于元素的优先级已更改,我如何明确命令 PriorityQueue 再次对其自身进行排序?
【问题讨论】:
标签: java queue priority-queue
删除对象,更改其优先级,然后将其重新添加到队列中。
我的直觉是数据结构通常不会观察对象的内部状态,它需要 add() 或 remove() 操作来触发比较器的重新调用。调用 Collections.sort() 也可以,但您必须将队列转换为列表,然后再转换回队列。如果您一次更改许多优先级,这可能更有意义。
更好的是,您可以更新 n 个优先级,然后添加和删除最后一个。
【讨论】:
唯一的选择是删除、修改和添加您的对象。 PriorityQueue 不会在读取时更新其内部结构。以下是 peek() 的暗示,例如:
public E peek() {
if (size == 0)
return null;
return (E) queue[0];
}
如您所见,不检查元素顺序是否已更改。
【讨论】: