2016-11-15 3 views
-3

は私が変更可能なScalaのセットを持っている内部の可変Scalaのコレクションを更新することができません:私は結果が設定されているループ(またはマップ)

valueSet -= 1 

(0,2)を実行

val valueSet = scala.collection.mutable.Set[Int](0, 1, 2) 

しかし、私はループやマップ内で同じことを実行します。

Range(0, 10).map(entry => valueSet -= 1) 
valueSet 
res130: scala.collection.mutable.Set[Int] = Set(0, 1, 2) 

valueSetの内容は次のとおりです。Set(0、1、2)。

ループを実行し、条件に基づいて、ループが終了するかSetが空になるまで、Setから要素を削除する必要があります。ループ内でvalueSetを印刷しようとしましたが、正しく動作していますが、ループが終了するとvalueSetが元のセットに戻ります。

変更可能なバージョンを使用すると、私が変更可能なバージョンを使用している理由のコードのパフォーマンスに深刻な影響を与えます。

助けてください!

EDIT: 私はスパークシェルREPLを使用しています。 (火花1.6.1)

私はいくつかのことをもっと試してみました。私がループやマップを実行していて、RDDを実行していても動作しないと分かりました。しかし、分散されていないコレクションの場合、それは機能します。私はこれがRDDの変換機能であり、何もしないという事実と関係があると推測しています。しかし、それは私の推測です。

+0

'map'という名前は、構造体をマップしています。それは物事の更新を行うのに使われることを意味するのではなく、前記構造の要素を変換することを意味します。実際に不変のバージョンを試しましたか?私はこれが再帰を使ってはるかにエレガントに(そして、funtional-ish)解決できると思います。 – rethab

+2

"valueSetの内容は次のとおりです。Set(0、1、2)。"いいえ、違います。私はちょうどREPLでそれを試みた。 'valueSet'の内容は' Set(0、2) 'に変更されます。おそらくあなたがマップで行ったことは 'valueSet - = 1'ではなく' valueSet-1'でしたか? – Suma

+0

はい、私はそれを見ているエレガントな方法があります。私はちょうどすぐに仕事を始めるために汚いものがほしいと思った。 –

答えて

1

それが動作し、その存在

val valueSet = scala.collection.mutable.Set[Int](0, 1, 2) 
    Range(0, 10).foreach(entry => valueSet -= entry) 

    println(valueSet.size) //size = 0 
+0

はい私はこれを投稿した直後に物事を試していましたが、私たちがマップしているオブジェクトがRDD –

1

たぶんfor理解をに従ってエントリを削除 - 私はあなたの実際の述語を推測しているので、ちょうどセットから値1を削除するよりも複雑です。 1つの新しい可変セットを返しますが、範囲内の各値に対して中間セットを生成しません。

scala> for { 
    | x <- valueSet 
    | if(x != 1)  // or whatever 
    | } yield x 

res1: scala.collection.mutable.Set[Int] = Set(0, 2) 
関連する問題