从每个循环中的ArrayList中删除对象

时间:2012-03-13 20:10:56

标签: java arraylist

当我完成它时,我想从ArrayList删除一个对象,但我找不到办法。试着像下面的示例代码中删除它不想工作。我怎样才能在这个循环中找到当前px对象的迭代器来删除它?

for( Pixel px : pixel){ 
[...]
  if(px.y > gHeigh){
     pixel.remove(pixel.indexOf(px)); // here is the thing
     pixel.remove(px); //doesn't work either
  }
}

6 个答案:

答案 0 :(得分:63)

你不能,在增强的for循环中。你必须使用“长手”的方法:

for (Iterator<Pixel> iterator = pixels.iterator(); iterator.hasNext(); ) {
  Pixel px = iterator.next();
  if(px.y > gHeigh){
    iterator.remove();
  }
}

当然,并非所有迭代器都支持删除,但您可以使用ArrayList

另一种方法是构建一个“要删除的像素”的附加集合,然后在列表末尾调用removeAll

答案 1 :(得分:23)

使用lamdba expressions,已为集合引入了方法removeIf

  

删除此集合中满足给定条件的所有元素   谓词。

所以它只需要一行:

pixels.removeIf(px -> px.y > gHeigh);

答案 2 :(得分:2)

您需要显式创建和访问迭代器

Iterator<Pixel> it = pixel.iterator();
while(it.hasNext()){
Pixel.px = it.next();
//...
it.remove();
}

答案 3 :(得分:2)

当有人在迭代时,您无法修改集合,即使有人是您。使用normal for循环:

for(int i = 0; i < pixel.size(); i++){
    if(pixel.get(i).y > gHeigh){
        pixel.remove(i);
        i--;
    }
}

答案 4 :(得分:1)

使用常规for循环,增强型for循环维护迭代器,不允许删除对象,或显式使用迭代器

修改:请参阅此问题的答案Calling remove in foreach loop in Java

答案 5 :(得分:0)

如果Pixel是您自己的自定义对象,那么您需要为Pixel对象实现equals和hashcode方法。 indexOf方法还使用equals方法查找索引。尝试实现并检查它。