2011-08-31 84 views
0

我有以下问题:我在“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); 
    } 
} 
+0

为什么你重复这一行两次? 'RewritingNode y = iter_y.next();'是一个错字吗? – Ali

+0

是的,对不起。这是一个双面复制 - 粘贴。 – eleni

+0

我的anawer有帮助吗?如果确实如此,请接受答案。 – Ali

回答

0

使用正常的索引,而不是迭代循环或增强的for循环,我认为你不能做的removeAll经历一个iterator而

+0

这与线程安全无关。这里的所有访问都是单线程的。这只是因为Java集合没有被设计为在迭代时被修改(除了CopyOnWriteArrayList和CopyOnWriteArraySet)。 –

+0

已编辑。我们不会得到ConcurrentModificationException吗? – Gireesh

+0

是的,我们这样做:(@Gireesh – eleni

2

把所有你想在一个单独的列表中删除的元素或在循环结束后设置并移除它们。在全部删除的情况下,设置一个布尔值,然后在while循环结束后执行此操作。或者,只需将所有元素添加到删除元素列表中,并在while循环结束后将其删除,否则您将得到某种并发修改异常。

更新

尝试使用队列,而不是无论你是在这里做的。像LinkedList这样的队列,它具有FIFO顺序。 LinkedList有一个remove()方法,它返回第一个元素并将其删除。使用它来获取第一个元素并进行比较,如果需要保留它,再次将它添加到列表中,它将成为最后一个元素。继续这样做直到列表为空,这应该为你做。

这应该比你的代码简单得多,不需要迭代器或多个集合。如果出于某种原因,当remove()方法返回元素时,您需要将已删除的元素添加到集合中(或者您希望保留的元素),请将其添加到您想要的任何集合中。

+0

感谢您的回复,但我不能这样做,因为我想在While循环中更新的S,这个想法如下:S = S1,if(y:sthing)then remove y从S开始,否则将y设为S3,S = S1 \ S3,直到S为空,即最后我应该有S = [],S3 = [y1,y2,..] – eleni

+0

前面是@Ali – eleni

+0

Eleni ,那么你会用通俗的语言来解释你正在尝试做什么? – Ali