Scala的TreeSet与Java的TreeSet - 民意调查?

时间:2013-04-04 10:45:26

标签: java scala priority-queue scala-collections treeset

如果我要删除Java log(n)TreeSet时间内的最高条目,我会使用treeSet.pollFirst() - Scala mutable.TreeSet类的等效内容是什么?

无论如何,我真正想要的是一个类似堆的优先级队列数据结构,它允许我以对数时间removeMaxaddupdatePriority。我查看了Scala集合库,我很困惑 - 虽然mutable.PriorityQueue让我deque(即removeMax)处于对数时间 - 它无法在日志时间内更新优先级(我会必须hackily扫描和删除项目并重新添加线性时间)。同样地,mutable.TreeSet会让我在对数时间内更新优先级(通过hackily删除和重新添加),但它没有removeMax(即pollFirst)操作。我应该使用什么集合容器?请不要将我介绍给外部依赖项。

2 个答案:

答案 0 :(得分:3)

您可以使用head中的lastimmutable.TreeSet方法,O(log n)mutable.TreeSet中存在相同的方法,但没有被覆盖以提供更好的效率和摊销时间(在Scala 2.10中)。 head方法将是对数的,但可以在执行此操作时实例化迭代器。 last方法实际上会遍历它,具有线性复杂性。好消息是,您可以使用自定义Ordering控制最小或最大的内容 - 并通过调用Ordering从现有Ordering.reverse轻松获取。

如果您需要删除该元素,只需使用-=即可。您可以创建自己的隐式值类来回退树集上的方法pollFirst

implicit class MyExtensions[T](ts: mutable.TreeSet[T]) extends AnyVal {
  def pollFirst(): T = {
    val elem = ts.head
    ts -= elem
    elem
  }
}

答案 1 :(得分:1)

不是答案,只是一个建议:)记住你可以从scala访问Java库(好吧,如果你编译到JVM :)所以如果Java的TreeSet适合你,请使用它:)

您还可以澄清您的要求;你的updatePriority方法的参数是什么?你试图更新谁的优先权?