2011-03-18 84 views
1

iterator.remove().是好的,但是我的問題:如果我想要一邊迭代,爲某種條件,從數組List刪除另一個對象。在java中迭代時刪除!但刪除其他然後當前對象

實施例(人是所述數組列表)

for (Iterator i = al.iterator(); i.hasNext();){ 
IEvent event =(IEvent) i.next(); 
    if (nbSendingWTS > 0 || nbSendingCTS > 0){ 
        i.remove(); 
        al.remove(swtsee); 
        al.remove(sdctsee); 
        System.out.println("dropping evtg"); 
       } 

這是給我一個錯誤:異常在線程 「主」 java.util.ConcurrentModificationException

而且正常迭代:

  for(IEVEnt event:al){} 

給出錯誤

要更清楚地看到swtsee廣告sdctsee是從先前迭代列表中取出並保存的,所以如果我有新條件,我可以刪除它。那麼當我檢測到它們將它們轉移到更高的索引然後使用反向迭代時,有沒有辦法?

怎麼辦?

+0

如果你真的需要做到這一點,可以考慮'ArrayBlockingQueue','ConcurrentLinkedQueue'或其他專爲併發使用而設計的集合。他們的迭代器保證不會拋出這個異常。但是,除非你真的使用多線程,否則它們可能是過火的。 – 2011-03-18 04:53:23

回答

1

正如您所討論的那樣,您無法移除元素。

迭代時不要刪除。

  • 保留Hash您想要的所有對象delete
  • 做第二次迭代,如果對象在Hash中,則使用.remove()進行刪除。
+0

完美!非常感謝。 – Vix 2011-03-18 05:01:47

1

如果您正在使用每種樣式或迭代器,則無法刪除。

使用正常的循環像下面

for(int i=0; i<al.size ; i++){ 
    if(something){ 
     al.remove(i) 
     i--; 
    } 

} 

這將工作。

+0

是的,但我想要刪除許多對象,當我找到條件。所以如果是在較低的指數,我會有問題 – Vix 2011-03-18 04:39:18

+0

我會做。例如你的列表有10個元素(size = 10)。目前你在第五元素,所以我= 4;現在你正在刪除第二個元素。 al.get(i)會返回給你下一個元素。 (我 - ,我++,其結果將是我) – 2011-03-18 04:49:17

+0

你的意思'的for(int i = al.size; I> 0; --i) 如果(東西) al.remove(I) ' – 2011-03-18 05:06:13

1

要使用一個Iterator中刪除,你收集在一個新的集合你的東西,並在最後一步刪除,例如:

// list := List (1, 2, 4, 3, 4, 9, 6, 5, 7, 8); 
List <Integer> toRemove = new ArrayList <Integer>();  
for (int i : list) 
    if (i % 2 == 0) 
     toRemove.add (i); 
list.removeAll (toRemove); 

我看不出a1連接到您的i 。只要它不被迭代,在迭代過程中應該很安全地調用這些。

1

供您參考Java Collections

你的代碼應該工作正常註釋以下行

for (Iterator i = al.iterator(); i.hasNext();) 
{ 
    IEvent event =(IEvent) i.next(); 
    if (nbSendingWTS > 0 || nbSendingCTS > 0) 
    { 
      // You have got the iterator for the underlying array list(al) 
      **only remove the elements through iterator.** 
      i.remove(); 

      // after remove thru iterator 
      // you are structurally modifiying arraylist directly(al.remove()) 
      // which gives u concurrent modification 
      // al.remove(swtsee); 
      // al.remove(sdctsee); 
      System.out.println("dropping evtg"); 
    } 
} 

和最好的辦法是

List<Integer> l = new ArrayList<Integer>(); 
    List<Integer> itemsToRemove = new ArrayList<Integer>(); 
    for (int i=0; i < 10; ++i) { 
    l.add(new Integer(1)); 
    l.add(new Integer(2)); 
    } 
    for (Integer i : l) 
    { 
     if (i.intValue() == 2) 
      itemsToRemove.add(i); 
    } 

    l.removeAll(itemsToRemove); 
    System.out.println(l);