2012-10-31 70 views
2

好吧,所以我認爲這將是一個單元,試圖實踐斯卡拉的收集操作員,我的例子是一個點列表。使用foldleft或其他運算符來計算點距離?

該類可以計算並返回到另一個點的距離(如雙倍)。

但是,摺疊左側似乎不是正確的解決方案 - 考慮元素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)=>) 

} 

回答

3

如果你想把它作爲一個摺疊,你可以,但你需要累加器保持總和前一個元素T:

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

使用完的最後一個元素,並和的元組consiting,所以使用._2得到的總和的一部分。

btw,^ on Int是按位邏輯XOR,而不是電源。使用math.pow

最聰明的方式可能使用zipped,這是一種迭代,從而你會使用zip你不遍歷列表不止一次:

(l, l.tail).zipped.map(_ dist _).sum 
+0

感謝您捕捉我的^錯誤,我曾想過也許這是爲了匹配函數的概念。你可以請進一步解釋「壓縮」是什麼 - 看起來「拉鍊」也起作用,我無法在Seq API上找到更多細節,或者它與zip不同。 – LaloInDublin

+0

這是Tuple2上的一種方法。請參閱http://stackoverflow.com/q/7068031/770361並鏈接回答或發佈其他問題! –

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 
+0

非常有用的例子,謝謝! – LaloInDublin