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。不过谢谢。我想你在找到一个符合你所有考虑的解决方案时会遇到问题。如果一个通行证和一套都是必须的,那么恐怕就没有解决办法了