2017-10-09 20 views
-1

任何人都可以解釋默認值在可變映射中的工作原理嗎?withDefaultValue in mutable.Map的行爲

scala> val mmap = mutable.Map[String, mutable.Set[String]]().withDefaultValue{mutable.Set[String]()} 
mmap: scala.collection.mutable.Map[String,scala.collection.mutable.Set[String]] = Map() 

scala> mmap("a") += "b" 
res1: scala.collection.mutable.Set[String] = Set(b) 

地圖是空的,沒有鍵。

scala> mmap 
res2: scala.collection.mutable.Map[String,scala.collection.mutable.Set[String]] = Map() 

但是我剛剛編輯的關鍵是顯示數據。

scala> mmap("a") 
res3: scala.collection.mutable.Set[String] = Set(b) 

爲什麼res2空地圖,mmap("a")有一個值?

+0

它看起來像你改變了默認值而不是創建一個映射條目。我也猜測,這不會像你所期望的那樣工作,因爲'mmap(「x」)== mmap(「y」)'都返回相同的(默認值)實例 – Bergi

+0

好吧,我還是不會真的理解。精心闡述? –

+0

它表現爲(mmap(「a」))。+ =(「b」)',而不是'mmap.assign(「a」,mmap(「a」)+「b」)' – Bergi

回答

3

通過修改映射中不存在的鍵,基本上可以更改默認值,而不是添加新的鍵。

比方說,你想添加一些東西來設置您的地圖中的鍵a

val mmap = 
    mutable.Map[ String, mutable.Set[ String ] ]() 
    .withDefaultValue(mutable.Set[ String ]()) 

// Changind default value 
mmap("a") += "b" 
mmap("a") += "c" 

現在缺省值mmap有2個元素,但仍然沒有鍵。現在,你「變」其他不存在的關鍵:

// Still changind default value 
mmap("c") += "c1" 

在現實中你仍然更改默認值

// Printing default value 
println(mmap("a")) 
// Result => Set(c, c1, b) 

爲了創建一個真正的關鍵應用分配

// Creating a new key 
mmap("b") = mutable.Set[ String ]("b1", "b2") 

mmap.foreach(println) 
// Result => (b,Set(b1, b2)) 
相關問題