2016-07-22 176 views
0

我正在查看可變的Set類,並參見union,intersect,diff等。所有這些設置操作都會創建一個新的Set。我很好奇,如果有更新Set的方法,而不是創建一個新的。否則,我必須從val切換到var,否則我必須跟進其他步驟。Scala:設置更新集合的操作?

如果我不清楚,請考慮.NET的HashSet類。它有IntersectWith,ExceptWithUnionWith修改集合。 LINQ擴展方法IntersectExceptUnion創建新的集合。我希望找到與「With」變體相同的東西。

這裏是一個低效率的做法,從頭開始重新集合:

val temp = original.diff(other) 
original.clear() 
original ++= temp 

顯然,這將是更有效地做到這一點:

for (value <- other if original.contains(value)) { 
    original.remove(value) 
} 
+0

你的意思是把'var'切換到'val'也許? :) – Alec

+0

不,'val'到'var'。我想保持對同一個集合的同一個引用。我想* mutate *該集合,而不是將引用替換爲新的集合。 –

+0

我的不好。完全正確。一個'val'給一個可變集合。菜鳥的錯誤。 – Alec

回答

2

參見:http://docs.scala-lang.org/overviews/collections/sets.html#operations-in-class-mutableset

例如:

增加:xs + = x添加元素x,將xs設置爲副作用,並返回xs本身。

所以只是忽略返回的值。該集應該在原地更新。

+0

想象一下,我想採用'diff',以便原始的'Set'不再包含另一個集合中的值。原始集合應該縮小。我需要找到需要刪除的元素,然後從原始集合中「 - =」它們。以下? –

+2

那麼這不是你所問:-)你可以' - ='一系列的項目,應該有你想要的效果。對於不在集合中的項目,' - ='應該沒有影響。 –