当我完成它时,我想从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
}
}
答案 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)
使用java-8和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方法查找索引。尝试实现并检查它。