【发布时间】:2015-06-30 11:39:24
【问题描述】:
假设我有一个HashSet:
[1, 2, 3, 4, 5, 6]
我想以这样的方式迭代它,对于给定的总和,比如 6,在迭代元素时,如果我在 Set 中找到 2 个元素的总和 = 6,我想删除另一个一。例如,如果我迭代 1,我应该删除 5。我试图做这样的事情:
HashSet<Integer> hs = new HashSet(arr);
int sum = 6;
for(int num : hs) {
if(hs.contains(sum - num)) {
hs.remove(sum - num);
}
}
显然它会抛出java.util.ConcurrentModificationException。另一种方法是使用迭代器,但它会删除当前元素并且不将任何其他元素作为参数。我还能用什么?
更新:我知道使用附加集合的技巧。如果可能的话,我只是想要一个非常优化的解决方案,而不会增加时间和空间的复杂性。
【问题讨论】:
-
将 sum-num 添加到一个新集合 (hs2) 中并在最后执行 hs.removeAll(hs2)?
-
我知道这种方法。试图找到更优化的东西。另外,我只想删除 for 循环中的元素,这样我什至不会遍历该元素。
-
从
ConcurrentHashMap创建一个Set可能吗?这可能有点矫枉过正,但会根据您的需要/需要工作。 -
如果你的总和是 6 并且你有数字 1 和 5,你怎么知道是去掉 1 还是 5?
-
我是。迭代哈希集。如果我首先遇到 1,我将删除另一个,即 5。我这样做是因为最后我打印了所有总和为 6 的数字对。如果我不删除 5,我得到的结果为 1, 5 和 5,1。为了消除这种重复,如果 1 已经迭代,我想停止迭代 5。
标签: java algorithm hashset concurrentmodification