更改PriorityQueue中元素的优先级

时间:2015-03-20 12:20:03

标签: java queue priority-queue

我知道PriorityQueue使用对象的add()方法compareTo()PriorityQueue会自动对元素进行排序。假设我想在某个时刻更改队列中元素的优先级。如果元素的优先级发生了变化,我如何显式地命令{{1}}再次自我排序?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

唯一的选择是删除,修改和添加对象。 PriorityQueue在读取时不会更新它的内部结构。以下是peek()的实施例如:

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

正如您所看到的,不会检查元素顺序是否已更改。