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