0

我想按键组合这个列表的值

List((1, 11), (2, 21), (1, 13), (1, 14), (2, 25))

并获得这样的列表:

List((1, List(11, 13, 14)), (2, List(21, 25)))

我正在考虑对每个元素使用 groupBy 然后 reduceLeft ,但我认为可能有更简单、更直接的方法?

4

2 回答 2

5
scala> val l = List((1, 11), (2, 21), (1, 13), (1, 14), (2, 25))
l: List[(Int, Int)] = List((1,11), (2,21), (1,13), (1,14), (2,25))


scala> l.groupBy(_._1).toList.map(xs => (xs._1, xs._2.map(t => t._2)))
res0: List[(Int, List[Int])] = List((2,List(21, 25)), (1,List(11, 13, 14)))
于 2013-10-10T17:06:38.273 回答
2

这类似于@Brians 解决方案,但使用模式匹配:

scala> val xs = List((1, 11), (2, 21), (1, 13), (1, 14), (2, 25))
l: List[(Int, Int)] = List((1,11), (2,21), (1,13), (1,14), (2,25))

xs.groupBy(_._1).toList.map { case (k, v) => (k, v.map(_._2)) }
res13: List[(Int, List[Int])] = List((1,List(11, 13, 14)), (2,List(21, 25)))

如果您可以将 Map 作为结果类型,则可以将其缩短一点:

xs.groupBy(_._1).map { case (k, v) => (k, v.map(_._2))}

或者:

xs.groupBy(_._1).map { t => (t._1, t._2.map(_._2))}
于 2013-10-10T18:40:14.190 回答