Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Scala中没有可变树映射?_Scala_Collections_Map_Tree_Mutable - Fatal编程技术网

为什么Scala中没有可变树映射?

为什么Scala中没有可变树映射?,scala,collections,map,tree,mutable,Scala,Collections,Map,Tree,Mutable,这是因为时间不够、技术问题还是不应该存在的原因?您还会注意到TreeSet也没有可变的等价物。这是因为它们共享公共基类RedBlack,而使树按元素或键排序的底层数据结构是。我对这个数据结构不太了解,但它相当复杂(插入和删除与其他映射相比相当昂贵),所以我认为这与不包含可变变量有关 基本上,这可能是因为底层数据结构不容易改变,所以TreeMap不容易改变。所以,回答你的问题,这是一个技术问题。当然,这是可以做到的,只是没有太多的使用案例。这只是一个缺失的案例,可能最终会被填补。没有理由不这样做,

这是因为时间不够、技术问题还是不应该存在的原因?

您还会注意到
TreeSet
也没有可变的等价物。这是因为它们共享公共基类
RedBlack
,而使
树按元素或键排序的底层数据结构是。我对这个数据结构不太了解,但它相当复杂(插入和删除与其他映射相比相当昂贵),所以我认为这与不包含可变变量有关


基本上,这可能是因为底层数据结构不容易改变,所以
TreeMap
不容易改变。所以,回答你的问题,这是一个技术问题。当然,这是可以做到的,只是没有太多的使用案例。

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


编辑:事实上它是在2.12中填写的


(也有一个相应的
集合。

可变
树映射可能有性能方面的原因,但通常可以使用与可变映射相同的不可变映射。您只需将其分配给
var
,而不是
val
。这与HashMap的情况相同,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)

同时,您可以使用Java树映射,这正是您所需要的

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

我认为原因是拥有一个可变的变体不会带来很大的好处。在其他答案中提到的一些情况下,可变映射可能会更有效一些,例如,在替换现有值时:可变变量可以避免创建新节点,但复杂性仍然是O(logn)


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

Java中的HashSet是一个可变的红黑树。红黑树并不是天生不变的。@Craig不,它们不是天生不变的,但有一些原因(我认为它们主要是基于性能的)可以解释为什么您不想实现可变的变体。并且不保留对mh,ih之前值的任何引用。这对我来说常常是一个拦路虎。有时候,你真的想要一个可共享的可变结构…@Paul我想你需要的是。Java的一个缺少所有的高阶函数,所以它没有那么有趣…
import collection.JavaConverters.\u
后跟
new Java.util.TreeMap[String,Int]().asScala
。您将获得SortedMap行为和更高阶的函数,但不会得到SortedMap函数。TreeMap和SortedMaps似乎都不是?关于信息,java TreeMap是“唯一”java,但它提供了一些scala等价物所没有的方法(如floorEntry)。在某些情况下非常实用。ImmutableMapAdapter已被弃用。请解释为什么它需要日志(n)而不是使用不可变树创建n个对象?我想所有的节点都会在修改后被创建。@Bin,不可变数据结构的一个优点是你可以利用“结构共享”。由于只需要更改树的一部分,其余部分与原始部分相同,因此不需要重新创建保持不变的部分,您可以只包含对原始部分的引用。