首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala与Java的TreeSet - TreeSet?

Scala与Java的TreeSet - TreeSet?
EN

Stack Overflow用户
提问于 2013-04-04 18:45:26
回答 2查看 1.2K关注 0票数 8

如果我想删除Java的TreeSetlog(n)时间的最高值,我会使用treeSet.pollFirst() --什么等同于Scala的mutable.TreeSet类?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-04 20:26:02

您可以在immutable.TreeSet中使用headlast方法,它们是O(log n)。同样的方法也存在于mutable.TreeSet中,但是还没有被覆盖以提供更好的效率和摊余时间(在Scala2.10中)。head方法将是对数的,但在这样做时可能会实例化迭代器。last方法实际上将遍历它,具有线性复杂性。好消息是,您可以使用自定义的Ordering控制最小或最大的值-并通过调用Ordering.reverse从现有的Ordering中轻松地获取它。

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

代码语言:javascript
复制
implicit class MyExtensions[T](ts: mutable.TreeSet[T]) extends AnyVal {
  def pollFirst(): T = {
    val elem = ts.head
    ts -= elem
    elem
  }
}
票数 3
EN

Stack Overflow用户

发布于 2013-04-04 20:55:17

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

您还可以阐明您的需求;updatePriority方法的参数是什么?你想要更新的是谁的优先级?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15808976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档