通用GenMap没有withDefaultValue,我不确定如何直接修改默认值。有没有办法做到这一点?
编辑:我需要它的功能如下所示:
def declassify(dots: GenSeq[Dot], locations: GenSeq[Dot]): GenMap[Dot, GenSeq[Dot]] = {
dots.groupBy {case dot => findFurthest(dot,locations)}
}
答案 0 :(得分:1)
我遇到了类似的问题,我就这样解决了这个问题(转移到你的问题):
val DEFAULT = ???
def declassify(dots: GenSeq[Dot], locations: GenSeq[Dot]): GenMap[Dot, GenSeq[Dot]] = {
val m = dots.groupBy { case dot => findFurthest(dot,locations) }
m ++ locations.filterNot(m.keySet.contains)
.map((_, DEFAULT))
.toMap
}
我必须承认,这看起来并不优雅,但它解决了这个问题。
答案 1 :(得分:0)
GenMap
是一种特征,没有定义拥有/使用默认值的方法。
如果您自己实例化GenMap,只需使用HashMap
,那么您将拥有withDefaultValue
。
或者您可以使用
genMap.get(key).getOrElse(default)
获得相同的行为。
def declassify(dots: GenSeq[Any], locations: GenSeq[Any]): HashMap[Any, GenSeq[Any]] = {
HashMap(dots.groupBy { case dot => "Furtherest" }.toSeq.seq:_*)
}
您可以使用此方法并在方法内部或外部添加默认值,或将其添加到内部。
def declassify(dots: GenSeq[Any], locations: GenSeq[Any]): Map[Any, GenSeq[Any]] = {
HashMap.empty[Any, GenSeq[Any]].withDefaultValue(Seq("default")) ++ dots.groupBy { case dot => "Furtherest" }
}
Scala经常将HashMap
内部包装起来。这样可以避免在这种情况下自己创建一个新的HashMap
def declassify(dots: GenSeq[String], locations: GenSeq[String]): Map[String, GenSeq[String]] = {
val x = dots.groupBy { case dot => "Furtherest" }
val z = x match {
case y: HashMap[String, GenSeq[String]] => y
case y => HashMap(x.toSeq.seq: _*)
}
z withDefaultValue Seq("default")
}
答案 2 :(得分:0)
另一种选择是将您的位置映射到具有默认值的元组,然后转换为地图,例如:
val DEFAULT = ???
def declassify(dots: GenSeq[Dot], locations: GenSeq[Dot]): GenMap[Dot, GenSeq[Dot]] = {
val m = dots.groupBy { case dot => findFurthest(dot,locations) }
locations.map(location => (location, m.getOrElse(location, DEFAULT)).toMap
}