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 有意义,在 ListBuffers 上它会很慢,因为索引确实需要线性时间。
我的猜测是,通过构建新的缓冲区来过滤会更有效,因此您通常只使用filter
并使用它的结果。否则,您可以编写自己的就地过滤方法:
def filterInPlace[A](b: collection.mutable.Buffer[A])(fun: A => Boolean): Unit = {
var sz = b.size
var i = 0; while(i < sz) {
if (fun(b(i))) {
i += 1
} else {
sz -= 1
b.remove(i)
}
}
}
val b = collection.mutable.ArrayBuffer((1 to 6): _ *)
filterInPlace(b)(_ % 2 == 1)
println(b)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)