2017-10-09 1 views
-1

誰でも可変マップのデフォルト値がどのように機能するのか説明できますか?mutable.MapのwithDefaultValueの振る舞い

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

を作成するためには

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

デフォルト値を変更している現実に

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

をマップエントリを作成するのではなく、デフォルト値を変更したようです。 'mmap(" x ")== mmap(" y ")'が同じ(デフォルト値)のインスタンスを返すので、期待通りに動作しないと思います。 – Bergi

+0

わかる。精巧な精神? –

+0

mmap.assign( "a"、mmap( "a")+ "b")ではなく '(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つの要素がありますが、キーはありません。今、あなた[変更]その他、存在しないキー:あなたはまだそれが見えます実際のキーの使用割り当て

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

mmap.foreach(println) 
// Result => (b,Set(b1, b2))