我有一个点数组。对于除第一个之外的每个点,我想减去前一个:
Array((1,1), (3,1), (4,3))
变成 Array((1,1), (2,0), (1 ,2))
我提出了一种“某种”函数式风格:
val trans = for (i <- 0 until points.length - 1)
yield {
(points(i + 1)._1 - points(i)._1, points(i + 1)._2 - points(i)._2)
}
val result = trans ++ points
但我觉得它可以做得更好。完成转换后,我将要在 result
中添加所有元组。
最佳答案
通常,您编写的 for-comprehension 是通过 zip
完成的:
(xs zip xs.drop(1)).map{ case ((x1,y1), (x2,y2)) => (x2-x1, y2-y1) }
其余的(添加第一个元素)是专门用于您自己的。 (您可以将 (0,0)
添加到 xs.drop(1)
的前面,或者将 xs.take(1)
添加到结果。)
另外,请注意,完全可以将整个算法与 sum 一起编写为单次折叠或递归。
(我假设您在这里没有性能限制。)
关于Scala 方法来转换点数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30716763/