我需要一個低通濾波器在我的斯卡拉項目之一,本想出了:如何在斯卡拉
def filter(numbers: Seq[Double], filterSize: Int): Seq[Double] = {
assert(filterSize > 0)
val ringBuffer = new Array[Double](filterSize)
var ringBufferIndex = 0
numbers.map(x => {
// update ring buffer
ringBuffer(ringBufferIndex) = x
// increase ring index
ringBufferIndex += 1
if (ringBufferIndex == filterSize) {
ringBufferIndex = 0
}
// get avarage
ringBuffer.foldLeft(0.0)(_ + _)/filterSize
})
}
然而,有一些事情我不不喜歡它:
- 它使用映射(很好的功能),但需要一個可變的變量(ringBufferIndex - 壞)。
它的工作是
Seq[Double]
(這很好),但返回Seq[Double]
,這是不好的,因爲它需要調用者調用.toList
或他實際使用的任何東西。我想在這裏使用泛型這樣的:def filter\[T <% Seq[Double]](numbers: T, filterSize: Int): T
但不會編譯。
有沒有人有建議如何改善這兩個問題?
不知道關於zipWithIndex,謝謝。 – Lemmy 2009-01-24 17:40:18