我有一个如下用例:
SET is a Set of Integer with size N
for i in SET (I mean only iterate the Set of size N at start point):
if i + 7 not in SET:
SET.add(i + 7)
return SET
除了使用辅助列表/集来存储需要插入的元素外,如何使用Java HashSet来实现这一点?
@@ lucasvw在这里隐藏了根本的问题-您需要以某种方式区分原始值和添加的值,否则,循环将无限期运行(或者至少直到这些值溢出到足以使它们开始重复为止)自己)。
执行此操作的最佳方法是确实有一个辅助设置来保存要添加的所有值:
Set<Integer> aux = original.stream().map(i -> i + 7).collect(Collectors.toSet());
original.addAll(aux);
如果您不想自己制作副本,Java可以为您做到:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArraySet.html。它不会更快或更神奇,但是您可以迭代“原始”并同时进行修改。
但是,如果想要高效的东西,那大概是用新元素创建另一个Set
,并在最后添加addAll()
。根据集合的大小,跳过容纳检查并将其留待合并的速度可能会更快。
[addAll()
及其BitSet
操作也可能要看一下,如果您的数字非负且幅度较小。
在迭代其内容时,不可能向BitSet
实例中添加某些内容;当使用or()
循环(Set
表示法)时,不允许进行任何修改,而在使用显式迭代器(foreach
表示法)时,可以调用for( var e : set )
来摆脱当前元素。但是在这种情况下,仍然无法添加新元素。
此行为由所有Java Collection类共享,尽管for( var i = set.iterator(); i.hasNext(); ) …
知道一个特殊的迭代器类i.remove()
,该类也允许通过调用List
添加条目(符号ListIterator
)–感谢@lucasvw提醒我在那上面。