我知道PriorityQueue
使用对象的add()
方法compareTo()
时PriorityQueue
会自动对元素进行排序。假设我想在某个时刻更改队列中元素的优先级。如果元素的优先级发生了变化,我如何显式地命令{{1}}再次自我排序?
答案 0 :(得分:3)
删除对象,更改其优先级,然后将其重新添加到队列中。
我的直觉是数据结构通常不会监视对象的内部状态,并且需要add()或remove()操作来触发比较器的重新调用。对Collections.sort()的调用也可以,但您必须将队列转换为列表然后再返回队列。如果你一次改变很多优先事项,这可能会更有意义。
更好的是,您可以更新n个优先级,然后添加和删除最后一个。
答案 1 :(得分:1)
唯一的选择是删除,修改和添加对象。 PriorityQueue
在读取时不会更新它的内部结构。以下是peek()
的实施例如:
public E peek() {
if (size == 0)
return null;
return (E) queue[0];
}
正如您所看到的,不会检查元素顺序是否已更改。