2010-12-11 7 views
15

私はListBufferを持っています。私は特定の条件を満たすすべての要素を削除したい。scala条件を満たすListBufferのすべての要素を削除します。

私はそれを反復して各要素を削除できます。しかし、あなたが反復しているリストを突然変異させることに関して、Scalaは何を言っていますか?それはうまくいくのだろうか、それとも間違った要素を削除するか、すべての要素を返さないだろうか? (REPLでの迅速な試みは、はい、それが台無しになることを示唆している)

私は繰り返し検索し、私はこれ以上見つからなくなるまで見つかった要素を削除する呼び出すことができますが、それは非効率的に聞こえます。

.filterは、要素なしで私に新しいListBufferを返しますが、私は場所でそれをやってみたいです。ここ

この

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

が有望に見えるが、私はかなりそれを使用する方法を見ることができない

私はこれをどのようにしたらよいでしょうか?

+0

http://stackoverflow.com/questions/2803085/iterators-for-mutable-collections-in-scala –

答えて

5

--=(xs: TraversableOnce[A])の実装(拡張形で、実際のコードでは、よりコンパクトである)である時点でいずれかの操作を行ってと同じくらい非効率的である

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

(すなわち、それはO(n*m)nは、元のリストの長さであるとmは削除するアイテムの数です)。一般的に

、可変コレクションは不変のものとしてメソッドの完全かつ強力なセットではありません。 (つまり、不変なコレクションには素晴らしい方法がありますが、自分自身のコレクションはほとんどありません)

非常にのオブジェクトを削除しない限り、リストをフィルタリングして作成するほうがよいでしょう新しいもの。

+3

"変更可能なコレクションには、完全で強力な一連のメソッドが不変のものとして含まれていません。"はい。これは残念です。関数型プログラミングは素晴らしいかもしれませんが、時には変更可能なデータ構造が本当に私の望むものであり、マルチプル専用オペレーションに対する比較的貧弱なサポートは少し残念です –

6

次の2つを組み合わせて、次の操作を行うことができます:あなたは、残念ながら、これを効率的に行うことはできません

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

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

パーフェクトも参照してください。おそらくダムになっているかもしれませんが、どうしたらうまくいくのでしょうか?フィルタはリストではなくイテレータを返しますか?あるいは、TraversableOnceは、リストが - =?に対するイテレータとして十分であることを意味しますか? –

+0

'TraversableOnce'はイテレータよりも一般的です。これは 'Traversable'(すべてのコレクションが基づいている)と' Iterator'の共通のスーパークラスです。 –

+0

http://www.scala-lang.org/docu/files/collections-api/collections.html –

関連する問題