为什么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)