我在我的一个 Scala 项目中需要一个低通滤波器并想出了这个:
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
})
}
但是,有一些我不喜欢它的地方:
- 它使用 map(功能很好),但需要一个可变变量(ringBufferIndex - BAD)。
它工作正常
Seq[Double]
(这很好),但返回Seq[Double]
,这是不好的,因为它需要调用者调用.toList
或他实际使用的任何东西。我尝试在这里使用泛型,如下所示:def filter\[T <% Seq[Double]](numbers: T, filterSize: Int): T
但这不会编译。
有没有人建议如何改善这两个问题?