Подтвердить что ты не робот

Удаление объекта из массива 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
  }
}
4b9b3361

Ответ 1

Вы не можете в пределах цикла for for. Вы должны использовать "длинный" подход:

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

Конечно, не все итераторы поддерживают удаление, но с ArrayList вы должны быть в порядке.

Альтернативой является создание дополнительной коллекции "пикселей для удаления", а затем вызов removeAll в списке в конце.

Ответ 2

Использование и выражения 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. Попробуйте выполнить это и проверить.