2011-08-05 5 views
4

Scala Multimapを使用していて、キーまたは空のセットに関連付けられた値を取得する場合は、次のように記述する必要がありますか?Scala multimap:アイテムを取得する、または空のセット

multimap.getOrElse("key", new collection.mutable.HashSet()) 

次のように動作するはずです。空のセットは良いデフォルト値のようです。

multimap.getOrElse("key") 

答えて

3

あなたが観察されたように、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 

は不思議、上記動作しません。ソースコードのコメントは、これは分散の問題によるものだと述べています。

+0

うーんこと。 ..もしgetOrElse(key)が追加されれば素晴らしいだろう! – schmmd

0

この使用例では、withDefaultValueを使用できます。たとえば、

import collection.mutable._ 
val multimap = Map[String, HashSet[String]]() withDefaultValue(new HashSet()) 
scala> multimap("key") 
// res1: scala.collection.mutable.HashSet[String] = Set() 
+0

これは期待どおりに動作していないようです。 'multimap(" key ")+ =" value "'はマップを変更しません。私はデフォルト値がキャッシュされていないと思います。 –

4

通常、これにはMap.withDefaultValueを使用します。しかし、実際にこの動作を得ることができず、まだMultiMap[A, B]と入力されたコレクションがあるかのように見えます。返品タイプはMultiMap.withDefaultValueで、Map[A, Set[B]]です。残念ながら、マルチマップミックスインの使用を断念して、あなたが望む動作を得る必要があります。

0

以来、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) 
関連する問題