Java 在迭代时从HashSet中删除元素

Java 在迭代时从HashSet中删除元素,java,algorithm,hashset,concurrentmodification,Java,Algorithm,Hashset,Concurrentmodification,假设我有一个哈希集: [1, 2, 3, 4, 5, 6] 我想以这样的方式迭代它,对于给定的和,比如说6,在迭代元素时,如果我在集中发现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 - nu

假设我有一个
哈希集

[1, 2, 3, 4, 5, 6]
我想以这样的方式迭代它,对于给定的和,比如说6,在迭代元素时,如果我在
集中发现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);
    }
}
HashSet hs=新的HashSet(arr);
整数和=6;
用于(整数:hs){
if(hs.contains(sum-num)){
hs.移除(总和-数量);
}
}
显然,它抛出
java.util.ConcurrentModificationException
。另一种方法是使用迭代器,但它会删除当前元素,并且不将任何其他元素作为参数。我还能用什么


更新:我知道使用额外的一套和所有的技术。如果可能的话,我只是想要一个不增加时间和空间复杂性的非常最优的解决方案

保存一组您找到的连续数字。

这将允许您获得一次性解决方案

从一个空的运行集开始,并遍历您的数字集。对于迭代通过的每个元素,如果其总和在集合中,则将其从迭代器中移除。否则,将其添加到运行集

HashSet<Integer> hs = new HashSet(arr);
HashSet<Integer> running = new HashSet();
int sum = 6;
Iterator<Integer> iter = hs.iterator();
while (iter.hasNext()) {
    int num = iter.next();
    if (running.contains(sum - num)) {
        iter.remove();
    } else {
        running.add(num);
    }
}
HashSet hs=新的HashSet(arr);
HashSet running=新HashSet();
整数和=6;
迭代器iter=hs.Iterator();
while(iter.hasNext()){
int num=iter.next();
if(running.contains(sum-num)){
iter.remove();
}否则{
正在运行。添加(num);
}
}

此代码将修改原始的
哈希集
,并且两个
哈希集
都将在代码块的末尾包含相同的内容。在这种情况下,最好只使用代码末尾设置的
running
,而不修改原始代码。这将使此代码更加灵活和可重用。

您可以使用排序列表。 首先,按递增顺序对数字进行排序。然后将两个迭代器一个放在第一个元素中,另一个放在最后一个元素中。然后在每一步中,如果迭代器下的两个项之和小于您想要的数字,您应该增加第一个迭代器,如果它的梯度,您应该减少第二个迭代器,如果它等于您想要的值,您可以选择它们并增加第一个迭代器和减少第二个迭代器


它比电视机工作得快

将sum num添加到一个新集合(hs2)中,并在最后执行hs.removeAll(hs2)?我知道这种方法。他试图找到更理想的东西。另外,我只想删除for循环中的元素,这样我就不会对该元素进行迭代?如果你的总数是6,你有数字1和5,你怎么知道是去掉1还是去掉5呢?我是。迭代哈希集。如果我先遇到1,我将删除另一个,即5。我这样做是因为最后我打印出了所有的数字对,总和为6。如果我不删除5,我得到的结果是1,5和5,1。为了消除这种双重性,如果1已经被迭代过,我想停止迭代5。不,第一个数字将保留,因为它的补充不在运行集中。第二个数字将被删除,因为第一个数字在运行集中。哦,当然+1.您应该提到,此方法对原始的
HashSet
具有破坏性,并且在循环结束时,这两个
HashSet
将是相同的(删除元素)。我知道这项技术,但我不想仅出于空间考虑而使用额外的HashSet。不过谢谢。我想你在找到一个符合你所有考虑的解决方案时会遇到问题。如果一个通行证和一套都是必须的,那么恐怕就没有解决办法了