2010-05-12 51 views
55
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B] 

如何将其转换为不可变?转换mutable为不可变的地图

+0

我猜* *您创建一个新的?只是猜测,但通常事情是这样工作的。 – 2010-05-12 08:24:10

+0

我不确定你的意思是 – Jeriho 2010-05-12 09:03:08

+0

hmm ..'MMMap.toMap'? – 2014-08-21 12:46:02

回答

56

不可变的层次结构不包含MultiMap,因此您将无法使用具有相同方便语法的转换结构。但是如果你很乐意处理关键/值集对,那么:

如果你只是想要一个可变的HashMap,你可以在2.8中使用x.toMap或者在2.7中使用collection.immutable.Map(x.toList: _*)

但是如果你希望整个结构是不可改变的 - 包括底层集合! - 那么你必须做更多的事情:你需要沿着路径转换集合。在2.8:

x.map(kv => (kv._1,kv._2.toSet)).toMap 

在2.7:

collection.immutable.Map(
    x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _* 
) 
+1

不耐烦等待scala 2.8稳定 – Jeriho 2010-05-13 10:44:02

24
scala> val mutableMap = new HashMap[Int, String] 
mutableMap: scala.collection.mutable.HashMap[Int,String] = Map() 

scala> mutableMap += 1 -> "a" 
res5: mutableMap.type = Map((1,a)) 

scala> mutableMap 
res6: scala.collection.mutable.HashMap[Int,String] = Map((1,a)) 

scala> val immutableMap = mutableMap.toMap 
immutableMap: scala.collection.immutable.Map[Int,String] = Map((1,a)) 

scala> immutableMap += 2 -> "b" 
<console>:11: error: reassignment to val 
     immutableMap += 2 -> "b" 
       ^
+0

当我看到“mutableMap.toMap”时,我感到很惊讶,但后来我验证了api并没有发现任何类似的东西。 http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html 第二个问题 - 设置[B]是可变的。这就是为什么转换不那么容易。 – Jeriho 2010-05-12 09:00:26

+3

@Jeriho:toMap在Scala2.8中引入 – Eastsun 2010-05-12 09:07:38

+0

Thx Eastsun。对不起杰里奥,我没有提到它。 – 2010-05-12 09:10:51

9

可以使用myMap.toMap到一个可变的地图转换成不可变的斯卡拉2.8及更高版本。

看着从文档的toMap定义:

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = { 
    val b = immutable.Map.newBuilder[T, U] 
    for (x <- self) b += x 
    b.result 
} 
2

您只需以下

val imm_map = MMMap.toMap