是否缺乏时间,某些技术问题或是否存在不存在的原因?
答案 0 :(得分:27)
这只是一个缺失的案例,可能最终会被填写。没有理由不这样做,并且在某些情况下它会比不可变树快得多(因为修改需要log(n)对象创建一个不可变树,只有1个可变树。)
编辑:事实上它已在2.12中填写。
(还有相应的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)