2

好的,所以我认为这很容易,尝试练习 Scala 的集合运算符,我的示例是点列表。

该类可以计算并返回到另一个点的距离(作为双精度)。

但是,向左折叠似乎不是正确的解决方案 - 考虑到元素 e1、e2、e3.. 我需要一个移动窗口来计算,我需要查看最后一个元素以在函数中结转 - 而不仅仅是总和

Sum {
  e1.dist(e2)
  e2.dist(e3)
  etc
} 

阅读 API,我注意到一个名为“滑动”的函数,也许这是与另一个运算符结合使用的正确解决方案。我当然知道如何使用循环来做到这一点,但尝试学习 scala 方式。

谢谢

import scala.math._

case class Point(x:Int, y:Int) {
  def dist(p:Point) = sqrt( (p.x-x)^2+(p.y-y)^2 )

}

object Point {

  //Unsure how to define this?
  def dist(l:Seq[Point]) =l.foldLeft(0.0)((sum:Double,p:Point)=>)

}
4

2 回答 2

4

我不太确定你想做什么,但假设你想要距离的总和:

l.zip(l.tail).map { case (x,y) => x.dist(y) }.sum

或滑动:

l.sliding(2).map { 
  case List(fst,snd) => fst.dist(snd)
  case _ => 0
}.sum
于 2012-10-31T07:22:29.230 回答
3

如果你想把它作为一个折叠,你可以,但你需要累加器来保留总数和前一个元素:

l.foldLeft(l.head, 0.0){ 
  case ((prev, sum), p) => (p, sum + p.dist(prev)) 
}._2

你完成了一个由最后一个元素和总和组成的元组,所以用它._2来获取总和部分。

顺便说一句,^在 Int 上是按位逻辑异或,而不是幂。使用math.pow.

最聪明的方法可能是使用zipped,这是一种迭代器,因此您不会像使用那样多次遍历列表zip

(l, l.tail).zipped.map( _ dist _ ).sum
于 2012-10-31T16:11:27.957 回答