从每个循环中的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 } } 

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

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

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

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

使用java-8和lamdba表达式 ,已经为集合引入了removeIf方法。

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

所以它只需要一行:

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

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

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

使用常规for循环,增强的for循环维护迭代器,不允许删除对象,或明确使用迭代器

编辑:请参阅此问题的答案在Java中调用foreach循环中的删除

当某人正在迭代它时,您无法修改集合,即使有人是您。 使用正常循环:

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

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