我有以下问题:我在“if”的第一部分使用迭代器来删除S的元素,但是我没有关于如何使用相同的迭代器从S中删除整个集合S3的线索再次在“其他”部分。有任何想法吗?提前谢谢!
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);
}
}
答案 0 :(得分:2)
将要删除的所有元素放在单独的列表中,或者在循环结束后设置并删除它们。在全部删除的情况下,设置一个布尔值,然后再次在while循环结束后执行此操作。或者只是将所有元素添加到删除元素列表中,并在while循环结束后删除它们,否则您将获得某种并发修改异常。
<强>更新强>
尝试使用队列而不是你在这里做的任何事情。像LinkedList
这样的队列,具有FIFO顺序。 LinkedList有一个remove()
方法,它返回第一个元素并将其删除。使用它来获取第一个元素并进行比较,如果你需要保留它,再次将它添加到列表中它将成为最后一个元素。继续这样做直到列表为空,这应该为你做。
这应该比您的代码简单得多,不需要迭代器或多个集合。如果出于某种原因,当remove()
方法返回元素时,您需要将已删除的元素添加到集合(或者您要保留的事件),将其添加到您想要的任何集合中。
答案 1 :(得分:0)
使用带索引的普通For循环而不是迭代器或增强的For循环,我认为你在通过迭代器时不能执行removeAll