Scala Multimapを使用していて、キーまたは空のセットに関連付けられた値を取得する場合は、次のように記述する必要がありますか?Scala multimap:アイテムを取得する、または空のセット
multimap.getOrElse("key", new collection.mutable.HashSet())
次のように動作するはずです。空のセットは良いデフォルト値のようです。
multimap.getOrElse("key")
Scala Multimapを使用していて、キーまたは空のセットに関連付けられた値を取得する場合は、次のように記述する必要がありますか?Scala multimap:アイテムを取得する、または空のセット
multimap.getOrElse("key", new collection.mutable.HashSet())
次のように動作するはずです。空のセットは良いデフォルト値のようです。
multimap.getOrElse("key")
あなたが観察されたように、MultiMap
形質はあなたがやりたいことはありません。ただし、マップが特に変更可能または不変の場合は、デフォルト値を自分で追加することができます。 m
のタイプは抽象collection.Map
であればここでは一例ですが、
scala> val m = collection.mutable.Map(1 -> 2)
m: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2)
scala> val m2 = m.withDefaultValue(42)
m2: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2)
scala> m2(1)
res0: Int = 2
scala> m2(2)
res1: Int = 42
は不思議、上記動作しません。ソースコードのコメントは、これは分散の問題によるものだと述べています。
この使用例では、withDefaultValue
を使用できます。たとえば、
import collection.mutable._
val multimap = Map[String, HashSet[String]]() withDefaultValue(new HashSet())
scala> multimap("key")
// res1: scala.collection.mutable.HashSet[String] = Set()
これは期待どおりに動作していないようです。 'multimap(" key ")+ =" value "'はマップを変更しません。私はデフォルト値がキャッシュされていないと思います。 –
通常、これにはMap.withDefaultValue
を使用します。しかし、実際にこの動作を得ることができず、まだMultiMap[A, B]
と入力されたコレクションがあるかのように見えます。返品タイプはMultiMap.withDefaultValue
で、Map[A, Set[B]]
です。残念ながら、マルチマップミックスインの使用を断念して、あなたが望む動作を得る必要があります。
以来、Garrett Rowenotedとして、withDefaultValue
はミックスインを使用しているとき、あなたの代わりに匿名クラスでdefault
メソッドをオーバーライドして、MultiMap
の動作を保持することができ、適切なMultiMap
タイプを保存しない:
scala> import collection.mutable.{ HashMap, MultiMap, Set }
import collection.mutable.{HashMap, MultiMap, Set}
scala> val map: MultiMap[String, Int] = new HashMap[String, Set[Int]] with MultiMap[String, Int] {
| override def default(key: String): Set[Int] = Set.empty[Int]
| }
map: scala.collection.mutable.MultiMap[String,Int] = Map()
scala> map("foo")
res0: scala.collection.mutable.Set[Int] = Set()
scala> map.addBinding("foo", 1)
res1: map.type = Map(foo -> Set(1))
scala> map("foo")
res2: scala.collection.mutable.Set[Int] = Set(1)
うーんこと。 ..もしgetOrElse(key)が追加されれば素晴らしいだろう! – schmmd