Удаление объекта из массива 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
}
}
Ответы
Ответ 1
Вы не можете в пределах цикла for for. Вы должны использовать "длинный" подход:
for (Iterator<Pixel> iterator = pixels.iterator(); iterator.hasNext(); ) {
Pixel px = iterator.next();
if(px.y > gHeigh){
iterator.remove();
}
}
Конечно, не все итераторы поддерживают удаление, но с ArrayList
вы должны быть в порядке.
Альтернативой является создание дополнительной коллекции "пикселей для удаления", а затем вызов removeAll
в списке в конце.
Ответ 2
Использование java-8 и выражения lamdba, для коллекций был введен метод removeIf
.
Удаляет все элементы этого набора, которые удовлетворяют заданному предикат.
Значит, это займет только одна строка:
pixels.removeIf(px -> px.y > gHeigh);
Ответ 3
вам нужно явно создать и получить доступ к итератору
Iterator<Pixel> it = pixel.iterator();
while(it.hasNext()){
Pixel.px = it.next();
//...
it.remove();
}
Ответ 4
используйте регулярный цикл for
, расширенный цикл for
поддерживает итератор и не позволяет удалять объекты или явно использует итератор
Изменить: см. ответ на этот вопрос Вызов удаления в цикле foreach в Java
Ответ 5
Вы не можете изменять коллекцию, в то время как кто-то итерирует ее, даже если это кто-то был вами. Используйте обычный цикл:
for(int i = 0; i < pixel.size(); i++){
if(pixel.get(i).y > gHeigh){
pixel.remove(i);
i--;
}
}
Ответ 6
Если Pixel - ваш собственный пользовательский объект, вам необходимо реализовать метод equals и hashcode для вашего объекта Pixel. Метод indexOf также находит индекс с использованием метода equals. Попробуйте выполнить это и проверить.