无法在循环(或映射)中更新可变Scala集合

时间:2016-11-15 07:52:20

标签: scala loops apache-spark collections mutable

我有一个可变的scala Set:

master

当我表演时

git rebase --continue

结果为Set(0,2)

但是当我在循环或地图中执行相同的操作时:

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

valueSet的内容保持:设置(0,1,2)。

我需要运行循环并根据某些条件从集合中删除元素,直到循环结束或Set变为空。我尝试在循环中打印valueSet并且它正常工作但是当循环结束时,valueSet返回到原始集。

使用不可变版本将严重影响代码的性能,这就是我使用可变版本的原因。

请帮忙!

编辑: 我正在使用spark-shell REPL。 (火花1.6.1)

我尝试了更多的东西,并想出如果我正在执行循环或映射和RDD,那么它不起作用。但对于非分布式的集合,它可行。我猜这与它在RDD上的转换函数并且不执行任何操作这一事实有关。但这只是我的猜测。

2 个答案:

答案 0 :(得分:1)

它可以根据存在情况删除条目

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

  println(valueSet.size) //size = 0 

答案 1 :(得分:1)

也许是for理解 - 因为我猜测你的实际谓词比仅从集合中移除值1更复杂。它将返回1个新的可变Set,但不会为该范围内的每个值生成中间集。

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

res1: scala.collection.mutable.Set[Int] = Set(0, 2)