在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))
然后我将分配子列表,我宁愿避免。
答案 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)
您还可以将groupBy
与mapValues
:
list.groupBy(_._1).mapValues(_.map(_._2).sum).toList
res1: List[(String, Int)] = List((A,5), (B,1))