【发布时间】:2019-07-24 22:42:39
【问题描述】:
我有一个元组列表,如下所示:
val list = List((1, 20), (2, 20), (1, 30), (2, 40), (2, 60))
我想将它映射到一个元组列表,其中:
第一个元素是唯一的。
第二个元素是从具有相同第一个值的元组中平均得出的。
即对于上面的列表,映射到:List((1, 25), (2, 40))
我想我可以这样做:
list.groupBy(_._1)
.map { case (key, value) =>
(key, value.map(_._2).sum / value.length)}.toList
但是在这样的地图之间进行转换似乎是不必要的冗长和昂贵的。有没有更好的方法?
【问题讨论】:
-
不是真的,想想你脑子里的算法,第一步是对事物进行分组,这需要一个中间数据结构。但是,如果您自己编写一个尾递归函数,则可以进行一些优化,例如在进行分组的同时跟踪总和和计数。
-
您可以使用 mapValues 简化“大地图”:
list.groupBy( _._1 ).mapValues { value => value.map(_._2).sum / value.length }.toList
标签: scala