Scala多重映射:获取项或获取空集
如果我正在使用Scala多重映射,并且我想要获得与键或空集相关联的值,那么我必须编写以下代码吗Scala多重映射:获取项或获取空集,scala,multimap,Scala,Multimap,如果我正在使用Scala多重映射,并且我想要获得与键或空集相关联的值,那么我必须编写以下代码吗 multimap.getOrElse("key", new collection.mutable.HashSet()) 看起来,下面的方法应该是有效的。空集似乎是一个很好的默认值 multimap.getOrElse("key") 正如您所观察到的,MultiMap特性并不能满足您的需要。但是,如果映射是特定可变或不可变的,则可以自己添加默认值。举个例子 scala> val m = col
multimap.getOrElse("key", new collection.mutable.HashSet())
看起来,下面的方法应该是有效的。空集似乎是一个很好的默认值
multimap.getOrElse("key")
正如您所观察到的,
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
,上述方法就行不通了。源代码中的注释表示这是由于差异问题。此用例可以使用with defaultvalue
。例如:
import collection.mutable._
val multimap = Map[String, HashSet[String]]() withDefaultValue(new HashSet())
scala> multimap("key")
// res1: scala.collection.mutable.HashSet[String] = Set()
通常您会使用
Map.withDefaultValue
进行此操作。但是,看起来您似乎无法真正获得此行为,并且仍然将集合键入为aMultiMap[a,B]
。MultiMap.withDefaultValue
的返回类型是Map[A,Set[B]]
。因此,不幸的是,您必须放弃使用MultiMap mixin来获得所需的行为。因为,as,with defaultvalue
在使用mixin时没有保留正确的MultiMap
类型,您可以替代匿名类中的default
方法,并保留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(关键)被添加!这似乎不像预期的那样有效<代码>多重映射(“键”)+=“值”不会修改映射。我猜默认值不会被缓存。