The*_*aul 15 scala scala-2.8 listbuffer
我有一个ListBuffer.我想删除所有符合特定条件的元素.
我可以迭代它并删除每个元素.但是,Scala如何改变你正在迭代的列表呢?它会工作,还是会删除错误的元素/不返回所有元素?(使用REPL的快速尝试表明是的,它会搞砸)
我可以反复调用find然后删除找到的元素,直到我找不到为止,但这听起来效率低下.
.filter将返回一个没有元素的新ListBuffer,但我想在适当的位置进行.
这个
def --= (xs: TraversableOnce[A]) : ListBuffer.this.type
Removes all elements produced by an iterator from this list buffer.
Run Code Online (Sandbox Code Playgroud)
看起来很有希望,但我不知道如何在这里使用它
我该怎么做?
您可以将两者结合起来并执行以下操作:
val lb = ListBuffer(1,2,3,4,5,6)
lb --= lb.filter(_ % 2 == 0)
println(lb)
// outputs: ListBuffer(1, 3, 5)
Run Code Online (Sandbox Code Playgroud)
不幸的是,你不能有效地做到这一点.--=(xs: TraversableOnce[A])is 的实现(以扩展形式;实际代码更紧凑)
xs foreach (x => this -= x) ; this
Run Code Online (Sandbox Code Playgroud)
这与一次做一个效率一样低效(即原始列表的长度O(n*m)在哪里,n是m要删除的项目数).
通常,可变集合没有像不可变集合那样完整和强大的一组方法.(也就是说,他们拥有在不可变集合中使用的所有精彩方法,但他们自己的相对较少.)
所以,除非你删除极少数的对象,你可能会更好过过滤列表创建一个新的.