从每个循环中的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方法查找索引。 尝试实现并检查出来。