为什么Scala中没有可变的TreeMap?
是缺乏时间,有些技术问题,还是有一个原因,它不应该存在?
这只是一个可能最终被填补的遗漏案例。没有理由不这样做,在某些情况下,它会比不变的树快得多(因为修改需要log(n)对象创build一棵不变的树,只有一个可变的树)。
编辑:实际上是在2.12填写。
可变的TreeMap 。
(也有相应的Set
。)
同时你可以使用Java TreeMap,这正是你所需要的。
val m = new java.util.TreeMap[String, Int]() m.put("aa", 2) m.put("cc", 3)
我认为,原因是有一个可变的变种不会带来很大的好处。 在其他答案中提到了一些情况,例如当一个可变映射可以更有效时,例如当replace一个已经存在的值时:一个可变variables会节省新节点的创build,但是复杂度仍然是O(log n) 。
如果您想保留对地图的共享引用,那么可以使用ImmutableMapAdaptor
,它将任何不可变的地图封装到可变结构中。
你也会注意到TreeSet
没有可变的等价物。 这是因为它们共享公共基类RedBlack
,并且保持由元素或键sorting的Trees
的底层数据结构是红黑树 。 我不太了解这个数据结构,但是它非常复杂(与其他地图相比,插入和移除相当昂贵),所以我认为这与可变的变体没有被包含在一起。
基本上,这可能是因为基础数据结构不容易变化,所以TreeMap
不是。 所以,要回答你的问题,这是一个技术问题。 这绝对可以做到,但没有太多的用例。
可变的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)