一尘不染

当Java PriorityQueue的元素更改优先级时更新

java

我正在尝试使用来使用PriorityQueue排序对象Comparator

这很容易实现,但是对象类变量(比较器用来计算优先级)在初始插入后可能会更改。大多数人提出了一种简单的解决方案,即删除对象,更新值并再次将其重新插入,因为这是优先级队列的比较器投入使用的时候。

除了围绕PriorityQueue创建包装器类之外,还有其他更好的方法吗?


阅读 525

收藏
2020-03-12

共1个答案

一尘不染

你必须删除并重新插入,因为队列的工作原理是在插入新元素时将它们放置在适当的位置。这比每次退出队列时查找优先级最高的元素的替代方法要快得多。缺点是插入元素后无法更改优先级。TreeMap具有相同的限制(与HashMap一样,在插入后其元素的哈希码更改时也会中断)。

如果要编写包装器,可以将比较代码从入队移到出队。你不再需要在入队时间进行排序(因为如果允许更改,它创建的顺序将始终不可靠)。

但这会导致性能变差,并且如果你更改任何优先级,都希望在队列上进行同步。由于在更新优先级时需要添加同步代码,因此你也可能只需要出队和入队(在两种情况下都需要引用队列)。

2020-03-12