2017-09-26 40 views
0

在阶折叠阶序列,给定对一个可迭代,说Iterable[(String, Int]), 是有办法积聚或折叠基于所述._1 S上的._2 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)) 

但当时做这个2个步骤我会分配我想避免的子列表。

回答

1

你可以建立的Map,你去和事实后,将其转换回一个List

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

你可以这样做:

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

您也可以使用groupBymapValues

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