Удаление объекта из ArrayList для каждого цикла - PullRequest
21 голосов
/ 14 марта 2012

Я хотел бы удалить объект из 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
  }
}

Ответы [ 6 ]

63 голосов
/ 14 марта 2012

Вы не можете, внутри расширенного цикла for.Вы должны использовать подход «длинной руки»:

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

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

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

23 голосов
/ 02 января 2014

Используя и lamdba выражений , для коллекций был введен метод removeIf.

Удаляет все элементы этой коллекции, которые удовлетворяют заданному предикат.

Так что это займет только одну строку:

pixels.removeIf(px -> px.y > gHeigh);
2 голосов
/ 14 марта 2012

Вы не можете изменять коллекцию, пока кто-то итерирует по ней, даже если это кто-то был вы.Использовать нормально для цикла:

for(int i = 0; i < pixel.size(); i++){
    if(pixel.get(i).y > gHeigh){
        pixel.remove(i);
        i--;
    }
}
2 голосов
/ 14 марта 2012

вам нужно явно создать и получить доступ к итератору

Iterator<Pixel> it = pixel.iterator();
while(it.hasNext()){
Pixel.px = it.next();
//...
it.remove();
}
1 голос
/ 14 марта 2012

используйте обычный цикл for, расширенный цикл for поддерживает итератор и не позволяет удалять объекты, или используйте итератор явно

Редактировать: см. Ответ на этот вопрос Вызов удаления в цикле foreach в Java

0 голосов
/ 14 марта 2012

Если Pixel - ваш собственный объект, вам нужно реализовать метод equals и hashcode для вашего объекта Pixel.Метод indexOf также находит индекс, используя метод equals.Попробуйте реализовать это и проверить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...