使用分组减少/折叠scala序列

时间:2017-09-26 04:34:00

标签: scala

在scala中,给出一对可变对,说Iterable[(String, Int]), 有没有办法根据._2积累或折叠._1?如下所示,将 A 之后的所有#s和 B之后的#<分开加起来

List(("A", 2), ("B", 1), ("A", 3))

我可以通过groupBy

分两步完成
val mapBy1 = list.groupBy( _._1 )
for ((key,sublist) <- mapBy1) yield (key, sublist.foldLeft(0) (_+_._2))

然后我将分配子列表,我宁愿避免。

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

list.foldLeft(Map[String, Int]()) {
   case (map, (k,v)) => map + (k -> (map.getOrElse(k, 0) + v))
}

答案 1 :(得分:1)

您可以随时构建Map并在事后将其转换回List

listOfPairs.foldLeft(Map[String,Int]().withDefaultValue(0)){
      case (m,(k,v)) => m + (k -> (v + m(k)))
    }.toList

答案 2 :(得分:0)

您还可以将groupBymapValues

一起使用
list.groupBy(_._1).mapValues(_.map(_._2).sum).toList
res1: List[(String, Int)] = List((A,5), (B,1))