【发布时间】:2011-05-30 17:34:33
【问题描述】:
是时间不够、技术问题还是不应该存在的原因?
【问题讨论】:
标签: scala collections map tree mutable
是时间不够、技术问题还是不应该存在的原因?
【问题讨论】:
标签: scala collections map tree mutable
这只是一个缺失的情况,可能最终会被填补。没有理由不这样做,并且在某些情况下它会比不可变树快得多(因为修改需要使用 log(n) 对象创建不可变树,只有 1 棵具有可变树)。
编辑:事实上它是在 2.12 中填写的。
(也有对应的Set。)
【讨论】:
同时您可以使用 Java TreeMap,这正是您所需要的。
val m = new java.util.TreeMap[String, Int]()
m.put("aa", 2)
m.put("cc", 3)
【讨论】:
import collection.JavaConverters._ 后跟 new java.util.TreeMap[String, Int]().asScala。您将获得 SortedMap 行为和高阶函数,但不会获得 SortedMap 函数。
我认为原因是拥有可变变体并没有带来很大的好处。在其他答案中提到了一些情况,当可变映射可能更有效时,例如在替换已经存在的值时:可变变体将节省新节点的创建,但复杂性仍然是 O(登录 n).
如果您想保留对映射的共享引用,可以使用ImmutableMapAdaptor,它将任何不可变映射包装到可变结构中。
【讨论】:
您还会注意到TreeSet 也没有可变的等价物。这是因为它们共享公共基类RedBlack,并且保持Trees 按元素或键排序的底层数据结构是red-black tree。我不太了解这种数据结构,但它非常复杂(与其他 Map 相比,插入和删除非常昂贵),所以我认为这与未包含可变变体有关。
基本上,这可能是因为底层数据结构不容易可变,所以TreeMap 不是。所以,要回答你的问题,这是一个技术问题。不过绝对可以做到,只是没有太多用例。
【讨论】:
可变TreeMap 可能存在性能原因,但通常您可以像使用可变映射一样使用不可变映射。您只需将其分配给var 而不是val。它与 HashMap 相同,具有可变和不可变的变体:
val mh = collection.mutable.HashMap[Int, Int]()
var ih = collection.immutable.HashMap[Int, Int]()
mh += (1 -> 2)
ih += (1 -> 2)
mh // scala.collection.mutable.HashMap[Int,Int] = Map(1 -> 2)
ih // scala.collection.immutable.HashMap[Int,Int] = Map(1 -> 2)
【讨论】:
ImmutableMapAdaptor。