2011-03-18 103 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); 
相关问题