【问题标题】:Scala folding tuplesScala折叠元组
【发布时间】:2016-09-26 17:06:26
【问题描述】:
Map(Mary -> List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414))):
  Map[String, List[(String, Int)]]

如何折叠地图以生成类似的东西

Map("Mary" -> List(("Mary", 7065+2604+1414))):
  Map[String, List[(String, Int)]]

?

【问题讨论】:

  • 我假设7065+2604+1414String
  • 我做了一些编辑,假设它实际上是总和,如果我弄错了,请道歉。
  • 不应该是一个int,只是懒得把它们加起来这样很容易理解

标签: scala dictionary fold


【解决方案1】:

对于您的特殊情况,您可以使用它

map.map { case (k, v) => k -> v.map(_._2).sum }

但通常下面的代码适用于所有内容,即使键不同

对元组中的第一项进行分组,然后折叠作为分组后结果映射值的列表

val list = Map("Mary")
list.groupBy(_._1).map { case (k, v) => v(0)._1 -> v.map(_._2).sum}

Scala REPL

 scala> val list = map("Mary")
 list: List[(String, Int)] = List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414))

 scala> list.groupBy(_._1).map { case (k, v) => v(0)._1 -> v.map(_._2).sum}
 res11: Map[String, Int] = Map("Mary" -> 11083)

 scala> val map =  Map("Mary" -> List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414)))
 map: Map[String, List[(String, Int)]] = Map("Mary" -> List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414)))

 scala> val list = map("Mary")
 list: List[(String, Int)] = List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414))

 scala> list.groupBy(_._1).map { case (k, v) => v(0)._1 -> v.map(_._2).sum}
 res14: Map[String, Int] = Map("Mary" -> 11083)

【讨论】:

    【解决方案2】:

    您按键分组,然后按值折叠:

    scala> val input = Map("Mary" -> List(("Mary", 1), ("Mary", 2), ("Mary", 3)))
    res1: Iterable[scala.collection.immutable.Map[String,List[(String, Int)]]] = List(Map(Mary -> List((Mary,1), (Mary,2), (Mary,3))))
    
    scala> input.values.map(_.groupBy(_._1).map { case (k, v) => (k -> v.map(_._2).foldLeft(0)(_ + _))})
    res7: Iterable[scala.collection.immutable.Map[String,Int]] = List(Map(Mary -> 6))
    

    【讨论】:

      【解决方案3】:
      val data = Map("Mary" -> List(("Mary", 7065), ("Mary", 2604), ("Mary", 1414)))
      
      data map { case (x,y) => (x, y.foldLeft(0)((acc, elem) => acc + elem._2)) }
      

      这会导致地图: scala.collection.immutable.Map[String,Int] = Map(Mary -> 11083)

      【讨论】:

      • 这个答案对于问题的“旧”版本是正确的。
      猜你喜欢
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      相关资源
      最近更新 更多