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

时间:2010-12-11 17:34:11

标签: 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.

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

我该怎么做?

2 个答案:

答案 0 :(得分:6)

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

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

println(lb)
// outputs: ListBuffer(1, 3, 5)

答案 1 :(得分:5)

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

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

这与一次执行一次效率低(即O(n*m),其中n是原始列表的长度,m是要删除的项目数

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

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