在java中迭代时删除!但删除当前对象以外的其他对象

时间:2011-03-18 04:24:29

标签: java arraylist iterator

iterator.remove().很好但是我的问题:如果我想要迭代,为了某种条件,从数组列表中删除另一个对象。

示例(al是arraylist)

  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");
                }

这给了我一个错误:线程“main”中的异常java.util.ConcurrentModificationException

也是正常的迭代:

          for(IEVEnt event:al){} 

发出错误

更清楚的是,swtsee和sddctsee是从arraylist的前一次迭代中获取并保存的,所以如果我有新的条件,我可以删除。那么当我检测到它们将它们转移到更高的索引然后我使用反向迭代时会有一种方法吗?

怎么办?

4 个答案:

答案 0 :(得分:1)

如果您使用的是每种样式或迭代器,则无法删除。

使用普通for循环,如下所示

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

}

这样可行。

答案 1 :(得分:1)

您无法删除您所讨论的元素。

迭代时不要删除。

  • Hash所有对象保留delete
  • 如果对象位于.remove(),则执行第二次迭代,使用Hash进行删除。

答案 2 :(得分:1)

要使用Iterator删除,您需要在新的Collection中收集您的内容,然后在最后一步中删除,例如:

    // 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);

我无法看到a1i的关联方式。只要它没有被迭代,在迭代时调用那些a1.remove (...) - 就应该是安全的。

答案 3 :(得分: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);