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

2つを組み合わせて、次のことを行うことができます。

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

残念ながら、これを効率的に行うことはできません。の実装--=(xs: TraversableOnce[A])は(拡張形式で、実際のコードはよりコンパクトです)

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

これは、一度に1つずつ実行するのと同じくらい非効率的です(つまり、元のリストの長さであり、O(n*m)削除するアイテムの数です)。nm

一般に、可変コレクションには、不変コレクションほど完全で強力なメソッドのセットがありません。(つまり、不変のコレクションで使用されるすべてのすばらしいメソッドがありますが、独自のメソッドは比較的少数です。)

したがって、削除するオブジェクトが非常に少ない場合を除いて、リストをフィルタリングして新しいオブジェクトを作成することをお勧めします。

于 2010-12-12T00:31:12.487 に答える