2010-05-12 30 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