Scala プロジェクトの 1 つで Low-Pass-Filter が必要だったので、次のように思いつきました。
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 - BAD) が必要です。
動作し
Seq[Double]
ますが (問題ありません)、 を返しますSeq[Double]
。これは、発信者が呼び出す.toList
か、実際に使用するものを必要とする悪い原因です。ここで Generics を次のように使用してみました。def filter\[T <% Seq[Double]](numbers: T, filterSize: Int): T
しかし、それはコンパイルされません。
これら2つの問題を改善する方法を提案する人はいますか?