Scalaは、不変シーケンスのフィルタリングにおいて非常に洗練されています。
var l = List(1,2,3,4,5,6)
l = l.filter(_%2==1)
しかし、ArrayBufferのような可変コレクションでこれを行うにはどうすればよいですか?私が見つけたのは、単一の要素またはスライスを削除するか、別のシーケンスから要素を削除することだけですが、述語によって指定された要素を削除するものは何もありません。
編集:私はこれに似たものを見つけることを望んでいました:
trait Removable[A] extends Buffer[A]{
def removeIf(p: A => Boolean){
var it1 = 0
var it2 = 0
while(it2 < length){
if( p( this(it2) ) ){
it2 += 1;
}
else {
this(it1) = this(it2)
it1 += 1;
it2 += 1;
}
}
trimEnd(it2-it1)
}
}
これは線形時間でフィルタリングされ、任意のバッファに混在させることができますが、意味があるのはArrayBufferだけです。リストバッファでは、インデックス作成に線形時間がかかるため、処理が遅くなります。