scala删除(就地)满足条件的ListBuffer的所有元素

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)

看起来很有希望,但我不知道如何在这里使用它

我该怎么做?

den*_*ips 6

您可以将两者结合起来并执行以下操作:

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)


Rex*_*err 5

不幸的是,你不能有效地做到这一点.--=(xs: TraversableOnce[A])is 的实现(以扩展形式;实际代码更紧凑)

xs foreach (x => this -= x) ; this
Run Code Online (Sandbox Code Playgroud)

这与一次做一个效率一样低效(即原始列表的长度O(n*m)在哪里,nm要删除的项目数).

通常,可变集合没有像不可变集合那样完整和强大的一组方法.(也就是说,他们拥有在不可变集合中使用的所有精彩方法,但他们自己的相对较少.)

所以,除非你删除少数的对象,你可能会更好过过滤列表创建一个新的.

  • "可变集合没有像不可变集合那样具有完整和强大的一组方法." 是.这太可惜了.函数式编程可能很棒,但有时可变数据结构确实是我想要的,而且对于multable-only操作的相对微弱的支持有点令人失望 (3认同)