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

使用分组减少/折叠scala序列,scala,Scala,在scala中,给定一对Iterable,例如Iterable[(String,Int]), 是否有方法根据\u 1累积或折叠\u 2s?如下图所示,将A后面的所有#相加,并将B后面的#分开 我可以通过groupBy分两步完成这项工作 val mapBy1 = list.groupBy( _._1 ) for ((key,sublist) <- mapBy1) yield (key, sublist.foldLeft(0) (_+_._2)) val-mappy1=list.groupB

在scala中,给定一对Iterable,例如
Iterable[(String,Int])
, 是否有方法根据
\u 1
累积或折叠
\u 2
s?如下图所示,将A后面的所有#相加,并将B后面的#分开

我可以通过groupBy分两步完成这项工作

val mapBy1 = list.groupBy( _._1 )
for ((key,sublist) <- mapBy1) yield (key, sublist.foldLeft(0) (_+_._2))
val-mappy1=list.groupBy(u._1)

对于((键,子列表)您可以执行以下操作:

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

你可以这样做:

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

您可以边走边构建
映射
,并在事后将其转换回
列表

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

您可以边走边构建
映射
,并在事后将其转换回
列表

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

您还可以将
groupBy
mapValues
一起使用:

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

您还可以将
groupBy
mapValues
一起使用:

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