如何将List中的相应值加总为元组?

blu*_*sky 0 scala

我有这种类型的列表细节:

case class Detail(point: List[Double], cluster: Int)

val details = List(Detail(List(2.0, 10.0),1), Detail(List(2.0, 5.0),3),
                   Detail(List(8.0,  4.0),2), Detail(List(5.0, 8.0),2))
Run Code Online (Sandbox Code Playgroud)

我希望将此列表过滤为一个元组,其中包含集群为2的每个对应点的总和

所以我过滤这个List:

details.filter(detail => detail.cluster == 2)
Run Code Online (Sandbox Code Playgroud)

返回:

List(Detail(List(8.0, 4.0),2), Detail(List(5.0, 8.0),2))
Run Code Online (Sandbox Code Playgroud)

这是我遇到麻烦的相应值的总和.在这个例子中,元组应该包含(8 + 5,4 + 8)=(13,12)

我正在考虑将列表展平,然后对每个相应的值求和

List(details).flatten 
Run Code Online (Sandbox Code Playgroud)

只返回相同的List

如何将List中的相应值加总为元组?

我可以使用for循环轻松实现这一点,只需将我需要的细节提取到计数器中,但功能解决方案是什么?

Ale*_*nov 5

如果不同Details 的列表有不同的长度,你想要发生什么?或者相同的长度与2不同?元组通常仅在需要预先固定数量的元素时使用; 如果你需要不同长度的元组,你甚至不能写一个返回类型.

假设所有这些都是相同长度的列表并且您得到一个列表作为回报,这样的东西应该工作(未经测试):

details.filter(_.cluster == 2).map(_.point).transpose.map(_.sum)
Run Code Online (Sandbox Code Playgroud)

即首先将所有points作为列表列表,将其转置,以便获得每个"坐标"的列表,并对每个列表求和.

如果您确实知道每个点都有两个坐标,这可能会反映在您的Point类型中,(Double, Double)而不是使用,List[Double]而您只需折叠点列表,这应该更有效.看的定义foldLeft和标准执行的sum来讲foldLeft:

def sum(list: List[Int]): Int = list.foldLeft(0)((acc, x) => acc + x)
Run Code Online (Sandbox Code Playgroud)

你应该很容易做你想做的事.