2017-03-18 71 views
2

设的第一个元素合并列表说我有一个列表:斯卡拉:如何由元组

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

如何作出这样的名单为:

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

与单一功能?

感谢

+0

只是使用groupBy – nmat

+0

你是什么意思的“单一功能”?使用'groupBy'会启动你,但没有一个标准库方法可以完成这个完整的转换。 – jwvh

+0

可能重复[如何合并两个元组列表?](http://stackoverflow.com/questions/13074031/how-to-merge-two-lists-of-tuples) – jwvh

回答

2

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))) 
+0

好的,谢谢,这给了我一个暗示。 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) 
+0

缺少最后一步。这会返回一个'Map'。 OP请求一个'List'。 – jwvh

+0

谢谢。更新了返回类型。 –