4

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

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

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

multimap.getOrElse("key")
4

4 に答える 4

4

通常、これに使用Map.withDefaultValueします。ただし、実際にはこの動作を取得できず、コレクションを。として入力しているように見えますMultiMap[A, B]。の戻りタイプはMultiMap.withDefaultValueですMap[A, Set[B]]。そのため、残念ながら、希望する動作を実現するには、MultiMapミックスインの使用を中止する必要があります。

于 2011-08-05T19:23:47.133 に答える
3

あなたが観察したように、MultiMap特性はあなたが望むことをしません。ただし、マップが特に変更可能または不変である場合は、デフォルト値を自分で追加できます。これが例です、

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

m不思議なことに、のタイプが抽象の場合、上記は機能しませんcollection.Map。ソースコードのコメントによると、これは差異の問題によるものです。

于 2011-08-05T19:12:21.617 に答える
0

は、このwithDefaultValueユースケースに使用できます。例えば:

import collection.mutable._
val multimap = Map[String, HashSet[String]]() withDefaultValue(new HashSet())
scala> multimap("key")
// res1: scala.collection.mutable.HashSet[String] = Set()
于 2011-08-05T19:15:58.520 に答える
0

Garrett Roweが 指摘したように、ミックスインを使用するwithDefaultValueと適切な型が保持されないため、代わりに匿名クラスMultiMapのメソッドをオーバーライドして、次の動作を保持できます。defaultMultiMap

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)
于 2016-05-02T21:22:57.810 に答える