当前位置: 首页 > 知识库问答 >
问题:

Scala::PriorityQueue=>更新特定项的优先级

吕飞翼
2023-03-14

我已经实现了从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不支持这一点,那么我应该使用哪个类来完成期望的行为呢?

共有1个答案

姜奇
2023-03-14

使用不可变的树映射(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以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。 我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有