2017-06-09 80 views
-1

我最近學習了scala,但是我在修改地圖值的時候發現了一個問題。修改scala地圖值

def exercise1():Map[String, Int]={ 
     val map = createMap() 
     var newMap = map 
    for((k,v) <- map){ 
     newMap(k) = 2 * v; 
    } 
     newMap 
    } 

函數exercise1可以運行。但是當我改變下一條線時

newMap(k) = v * 2; 

我發現它失敗了,爲什麼?

+0

可以嗎分享你正在努力實現的目標? –

+0

你說'2 * v'改成'v * 2'會不會失敗?失敗如何?它不再編譯?它是否以不同的結果運行?請澄清。 – jwvh

+0

「它失敗」並不是一個足夠準確的錯誤描述,可以幫助我們。 *什麼*失敗? *它是如何失敗的?你的代碼有什麼問題?你有錯誤信息嗎?什麼是錯誤信息?你得到的結果不是你期待的結果嗎?你期望得到什麼結果?爲什麼?你得到了什麼結果?兩者有什麼不同?你正在觀察的行爲不是所期望的行爲?什麼是期望的行爲,爲什麼,觀察到的行爲是什麼,以及它們以何種方式不同? –

回答

0

我不確定什麼createMap()函數返回,但我的猜測是它返回一個Map[String, Int]

如果這是真的,那麼您的代碼將失敗,因爲Map[String, Int]是不可變的,並且您不能使用此代碼newMap(k) = 2 * v將值重新分配給不可變映射。您必須在此使用mutable.Map[String, Int]

示例代碼(在斯卡拉REPL):

scala> val x = Map("foo" -> 1, "bar" -> 2) 
x: scala.collection.immutable.Map[String,Int] = Map(foo -> 1, bar -> 2) 

scala> var y: scala.collection.mutable.Map[String, Int] = scala.collection.mutable.Map(x.toSeq: _*) 
y: scala.collection.mutable.Map[String,Int] = Map(foo -> 1, bar -> 2) 

scala> y("foo") = 3 

scala> y 
res2: scala.collection.mutable.Map[String,Int] = Map(foo -> 3, bar -> 2) 

但是,你所需要的就是隻是一個新的地圖加倍所有的值,你可以簡單地做:

x.map { case (k, v) => k -> 2 * v }