2016-07-22 98 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

那么这不是你所问:-)你可以' - ='一系列的项目,应该有你想要的效果。对于不在集合中的项目,' - ='应该没有影响。 –