如何在Scala中修改GenMap的默认值?

时间:2016-06-16 10:55:08

标签: scala

通用GenMap没有withDefaultValue,我不确定如何直接修改默认值。有没有办法做到这一点?

编辑:我需要它的功能如下所示:

  def declassify(dots: GenSeq[Dot], locations: GenSeq[Dot]): GenMap[Dot, GenSeq[Dot]] = {
      dots.groupBy {case dot => findFurthest(dot,locations)}
  }

3 个答案:

答案 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
}