如何在if语句中使用迭代器 - 在java中使用removeAll循环?
问题描述:
我有以下问题:我在“if”的第一部分中使用迭代器来删除S的一个元素,但我没有关于如何使用同一个迭代器从S中删除整个集合S3的线索在“其他”部分。有任何想法吗?先谢谢你!如何在if语句中使用迭代器 - 在java中使用removeAll循环?
public void f(RewritingNode x, Set<RewritingNode>S0){
Set<RewritingNode> S1 = new HashSet<RewritingNode>();
Set<RewritingNode> S3 = new HashSet<RewritingNode>();
S1.addAll(x.children);
S0.addAll(S1);
Set<RewritingNode> S = new HashSet<RewritingNode>();
S.addAll(S1);
while (!S.isEmpty()){
for (Iterator<RewritingNode> iter_y= S.iterator(); iter_y.hasNext();) {
RewritingNode y = iter_y.next();
RewritingNode y = iter_y.next();
if(S0.containsAll(y.parents)||y.parents.isEmpty()){
iter_y.remove();
}
else {
S3.add(y);
S.addAll(S1);
S.removeAll(S3);
}
}
}
Set<RewritingNode> removedChildren = new HashSet<RewritingNode>();
removedChildren.addAll(S1);
removedChildren.removeAll(S3);
for(RewritingNode x1 :removedChildren){
x1.parents.removeAll(x1.parents);
f(x1,S0);
}
}
答
把所有你想在一个单独的列表中删除的元素或在循环结束后设置并移除它们。在全部删除的情况下,设置一个布尔值,然后在while循环结束后执行此操作。或者,只需将所有元素添加到删除元素列表中,并在while循环结束后将其删除,否则您将得到某种并发修改异常。
更新
尝试使用队列,而不是无论你是在这里做的。像LinkedList
这样的队列,它具有FIFO顺序。 LinkedList有一个remove()
方法,它返回第一个元素并将其删除。使用它来获取第一个元素并进行比较,如果需要保留它,再次将它添加到列表中,它将成为最后一个元素。继续这样做直到列表为空,这应该为你做。
这应该比你的代码简单得多,不需要迭代器或多个集合。如果出于某种原因,当remove()
方法返回元素时,您需要将已删除的元素添加到集合中(或者您希望保留的元素),请将其添加到您想要的任何集合中。
为什么你重复这一行两次? 'RewritingNode y = iter_y.next();'是一个错字吗? – Ali
是的,对不起。这是一个双面复制 - 粘贴。 – eleni
我的anawer有帮助吗?如果确实如此,请接受答案。 – Ali