【问题标题】:Append Map(key, Set[value]) in a Map to existing Key in Scala 2.11将 Map 中的 Map(key, Set[value]) 附加到 Scala 2.11 中的现有 Key
【发布时间】:2019-11-16 04:12:06
【问题描述】:

我正在尝试将新值附加到现有键的 Set(Values) 中,但它正在替换现有值。

这是我的输入

val roads = Array(Array(0,1),Array(0,2),Array(1,2))

预期输出:

Map(0 -> Set(1,2),1 -> Set(2))

我的代码:

  val roads = Array(Array(0,1),Array(0,2),Array(1,2))
  var adjMatrix:Map[Int,Set[Int]] = Map()

  for(i <- 0 until roads.size; j <- 1 until roads(i).size){
    adjMatrix += (roads(i)(0) -> Set(roads(i)(j)))
  }

当我这样做时

  adjMatrix.foreach(println)

我得到以下结果,因为有两个名称为 0 的键,它替换了第 0 个索引处的 (0,1) 元素

(1,Set(2))
(0,Set(2))

【问题讨论】:

  • 它可以有两个以上的元素,但第一个元素总是键,其余元素是值。

标签: scala functional-programming


【解决方案1】:

试试

roads
  .groupBy(a => a(0))
  .map { case (key, value) => key -> (value.flatten.toSet - key) }

哪个输出

Map(1 -> Set(2), 0 -> Set(1, 2))

【讨论】:

  • 我稍微修改了你的解决方案:roads.groupBy(a => a(0)).map(a => Map(a._1 -> (a._2.flatten.toSet - a ._1)))
【解决方案2】:

您可以做的是首先提取每个组的密钥。
然后,groupBy 那把钥匙。
最后,连接所有值并将它们变成最终的Set

(注意:我将 Array 更改为 List,因为提取数组的 tail 是一项非常昂贵的操作。 p>

val roads = List(List(0,1),List(0,2),List(1,2))

val adjMatrix =
  roads.map {
    case x :: xs => x -> xs // This may fail if the list is empty!
  } groupBy {
    case (key, _) => key
  } map {
    case (key, values) => key -> values.flatMap(_._2).toSet // _._2 === case (_, values) => values.
  }

// adjMatrix: Map[Int, Set[Int]] = Map(1 -> Set(2), 0 -> Set(1, 2))

PS:我建议你至少升级到 Scala 2.12

【讨论】:

  • 感谢解答,我们项目中的Apache Spark版本不兼容2.12,所以现在升级到2.12是不可行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2021-12-16
  • 1970-01-01
  • 2015-03-22
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多