2011-08-31 66 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