我已经实现了从head中提取item,更新它的优先级并将它放回队列的例程(使用AtomicReference)
def head(): Entry = {
def takeAndUpdate(e: Entry, success: Boolean): Entry = {
if (success) {
return e
}
val oldQueue = queueReference.get()
val newQueue = oldQueue.clone()
val item = newQueue.dequeue().increase()
newQueue += item
takeAndUpdate(item.e, queueReference.compareAndSet(oldQueue, newQueue))
}
takeAndUpdate(null, false)
}
现在我需要找出队列中的任意条目,更改它的优先级并将其放回队列中。看来PriorityQueue不支持这一点,那么我应该使用哪个类来完成期望的行为呢?
使用不可变的树映射(immutable.treemap
)来完成此操作。您必须以某种方式找到您想要的条目--最好的方法是将用于查找条目的信息(key
)与一个键相关联,并将您希望与映射中的值一起返回的实际条目(将此entry
)相关联。
使用treeReference
重命名queueReference
。在创建集合的代码部分,使用immutable.treemap[Key,Entry](
<list of="" elements="">
)
。
然后像这样修改代码:
def updateKey(k: Key) {
@annotation.tailrec def update(): (Key, Entry) = {
val oldTree = treeReference.get()
val entry = oldTree(k)
val newPair = modifyHoweverYouWish(k, entry)
val newTree = (oldTree - k) + newPair
if (treeReference.compareAndSet(oldTree, newTree)) newPair
else update()
}
update()
}
或者,您可以使用immutable.treeSet
-如果您知道对entry
对象的确切引用,您可以使用它通过-
移除元素,如上所述,然后在调用increase()
后将其添加回来。代码几乎是一样的。
问题内容: 我正在尝试使用来使用排序对象。 这很容易实现,但是对象类变量(比较器用来计算优先级)在初始插入后可能会更改。大多数人提出了一种简单的解决方案,即删除对象,更新值并再次将其重新插入,因为这是优先级队列的比较器投入使用的时候。 除了围绕PriorityQueue创建包装器类之外,还有其他更好的方法吗? 问题答案: 你必须删除并重新插入,因为队列的工作原理是在插入新元素时将它们放置在适当的位
我试图在Java中实现一个稳定的(先进先出)优先级队列。假设键是一个名称,值是一个年龄,我知道我可以像这样制作一个不稳定的优先级队列: 这几乎完成了我需要它做的所有事情,除了它在我插入(或移除)键值对时不保持它们的顺序。 编辑: 感谢你在第一条评论中提出的好问题。我所说的FIFO是指对于具有相等值的键值对,首先放入的键值对应该首先被提取。
我知道PriorityQueues的迭代器没有返回正确的顺序,因此我查看顺序的能力受到限制--但是我可以看到元素离开队列的顺序,而且它显然没有按照我希望的路径运行。 建议?
问题内容: 一旦PriorityQueue中对象的优先级发生更改,Java是否有一种简便的方法来重新评估堆?我在中找不到任何迹象,但是必须有某种方法可以做到这一点,对吗?我当前正在删除对象,然后重新添加它,但这显然比在堆上运行更新要慢。 问题答案: 您可能需要自己实现这样的堆。您需要对项目在堆中的位置有一些处理,并需要有一些方法可以在优先级发生变化时向上或向下推项目。 几年前,我在学校工作中写了这
我正在寻找一种通过优先级和先到先服务(FCFS)调度线程的方法,如果两个线程具有相同的优先级。我在考虑使用一堆队列或类似的东西。问题是,即使我实现了自己的优先级队列,更改优先级的能力也会破坏插入到该队列的顺序。
我在这个问题上发现了一些类似的问题,但我想再问一遍,以便得到一个更明确的答案。我正在编写一个图匹配算法,其中图上的每个节点分配给一个优先级集,取决于其邻居的匹配。细节其实并不重要,但我使用了std::priority_queue以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。 我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有