Scala:如何通过元组的第一个元素合并列表

3

假设我有一个列表:

[(A, a), (A, b), (A, c), (B, a), (B, d)]  

我该如何将列表变成:
[(A, [a,b,c]), (B, [a,d])]  

只使用一个函数吗?

谢谢


只需使用 groupBy。 - nmat
“单一函数”是什么意思?使用 groupBy 可以帮助你入门,但没有单一的标准库方法可以完成这个完整的转换。 - jwvh
可能是重复的问题,关于如何合并两个元组列表?参见以下链接:How to merge two lists of tuples? - jwvh
2个回答

4

groupBy 函数可以实现此功能:

scala> val list = List((1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'd'))
list: List[(Int, Char)] = List((1,a), (1,b), (1,c), (2,a), (2,d))

scala> list.groupBy(_._1) // grouping by the first item in the tuple

res0: scala.collection.immutable.Map[Int,List[(Int, Char)]] = Map(2 -> List((2,a), (2,d)), 1 -> List((1,a), (1,b), (1,c)))

好的,谢谢,这给了我一个提示。groupByKey就是答案。 - NormalGuy

0

仅仅使用groupBy方法并不能得到你所期望的格式,因此我建议你为此编写一个自定义方法。

def groupTuples[A,B](seq: Seq[(A,B)]): List[(A, List[B])] = { 
   seq.
   groupBy(_._1).
   mapValues(_.map(_._2).toList).toList
}

然后调用它以获得所需的结果。

val t = Seq((1,"I"),(1,"AM"),(1, "Koby"),(2,"UP"),(2,"UP"),(2,"AND"),(2,"AWAY"))

groupTuples[Int, String](t)

缺少最后一步。这会返回一个 Map。操作请求一个 List - jwvh
谢谢。已更新返回类型。 - Swadhin Shahriar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接