为什么Scala中没有可变的TreeMap?

时间:2010-12-25 22:05:13

标签: scala collections map tree mutable

是否缺乏时间,某些技术问题或是否存在不存在的原因?

5 个答案:

答案 0 :(得分:27)

这只是一个缺失的案例,可能最终会被填写。没有理由不这样做,并且在某些情况下它会比不可变树快得多(因为修改需要log(n)对象创建一个不可变树,只有1个可变树。)


编辑:事实上它已在2.12中填写。

Mutable TreeMap

(还有相应的Set。)

答案 1 :(得分:6)

与此同时,您可以使用Java TreeMap,这正是您所需要的。

val m = new java.util.TreeMap[String, Int]()
m.put("aa", 2)
m.put("cc", 3)

答案 2 :(得分:6)

我认为原因是拥有一个可变的变体并没有带来很大的好处。当可变映射可能更有效时,在其他答案中提到了一些情况,例如当替换已存在的值时:可变变量将节省新节点的创建,但复杂性仍然是 O( log n)

如果要保留对地图的共享引用,可以使用ImmutableMapAdaptor将任何不可变映射包装到可变结构中。

答案 3 :(得分:2)

您还会注意到TreeSet也没有可变的等价物。这是因为它们共享公共基类RedBlack,并且保持按元素或键排序的Trees的基础数据结构是red-black tree。我不太了解这个数据结构,但它相当复杂(与其他地图相比,插入和删除相当昂贵),所以我认为这与可能不包含的可变变体有关。

基本上,可能是因为底层数据结构不容易变异,所以TreeMap不是。所以,回答你的问题,这是一个技术问题。虽然它肯定可以完成,但它的用例并不多。

答案 4 :(得分:1)

可变性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)