我正在将我的 Java 代码库迁移到纯 Scala,但我被卡住了 on this one piece of code .我有一个 IntervalMap 的实现,即一个数据结构,可以让你有效地将范围 [from,to]
映射到 values
其中 set
, delete
和 get
操作都是 O(log n)
(与 IntervalTree 或 SegmentTree 略有不同)。
此代码使用 Java 的 java.util.TreeMaps
,在迁移到 Scala 时,我遇到了 2 个大问题:
Scala 没有
mutable.TreeMap
- 我决定使用mutable.TreeSet
绕过它(奇怪的是 Scala 有mutable.TreeSet
但没有mutable.TreeMap
) 用于存储键并将值存储在辅助mutable.Map
中。这是一个令人不快的 hack,但有没有更好的方法?下一个问题是Scala的
mutable.TreeSet
没有java.util.TreeSet
的ceilingKey
,floorEntry
、pollFirst
、pollLast
这些都是Java中的O(log n)
操作。
那么,我怎样才能最好地将我的代码迁移到 Scala?在这些情况下,最佳实践是什么?我真的不想编写自己的树实现。有没有更惯用的 Scala 方式来编写我不知道的 IntervalMaps?或者那里有一些著名的图书馆?或者 Scala 只是用它的 gimped TreeSet 和不存在的 TreeMaps 简单地吸吮这里。当然,我可以在 Scala 中使用 Java 的 TreeMap
,但这很丑,而且我失去了所有漂亮的 Scala 集合功能,我还不如使用 Java。
这是我当前的 Java 代码:https://gist.github.com/pathikrit/5574521
最佳答案
不幸的是,答案是只使用 Java TreeMap
类。
Scala 没有自己的一切副本,这是最值得注意的异常(exception)之一。它与 Java 兼容的原因之一是您不必重新发明每个轮子。
你仍然想使用 Scala 的原因是 你写的每一段代码都不是关于这个 TreeMap 的。您的 IntervalMap
可以是 Scala IntervalMap
;您只需在内部使用 Java TreeMap
来实现它。或者您可以使用 Scala 中的不可变版本,它现在对于不可变版本的性能相当不错。
也许在 2.11 或 2.12 中会有一个可变的 TreeMap
;它需要有人编写、测试、优化等,但我认为拥有它在哲学上没有异议。
关于java - 将 Java TreeMap 代码迁移到 Scala?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16538641/