16

我有一个 ListBuffer。我想删除所有满足特定条件的元素。

我可以遍历它并删除每个元素。但是 Scala 对改变你正在迭代的列表有什么看法?它会起作用,还是会删除错误的元素/不返回所有元素?(对 REPL 的快速尝试表明是的,它会搞砸的)

我可以反复调用 find ,然后删除找到的元素,直到找不到更多,但这听起来效率低下。

.filter 将返回一个没有元素的新 ListBuffer ,但我想就地执行它。

这个

def --= (xs: TraversableOnce[A]) : ListBuffer.this.type
Removes all elements produced by an iterator from this list buffer.

看起来很有希望,但我不太明白如何在这里使用它

我该怎么做?

4

2 回答 2

6

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

val lb = ListBuffer(1,2,3,4,5,6)
lb --= lb.filter(_ % 2 == 0)

println(lb)
// outputs: ListBuffer(1, 3, 5)
于 2010-12-11T18:37:30.960 回答
5

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

xs foreach (x => this -= x) ; this

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

一般来说,可变集合没有像不可变集合那样完整和强大的一组方法。(也就是说,它们拥有用于不可变集合的所有美妙方法,但它们自己的相对较少。)

因此,除非您删除的对象很少,否则您最好过滤列表以创建一个新对象。

于 2010-12-12T00:31:12.487 回答