我有这种类型的列表细节:
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循环轻松实现这一点,只需将我需要的细节提取到计数器中,但功能解决方案是什么?
如果不同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)
你应该很容易做你想做的事.