21

I would like to remove an object from an ArrayList when I'm done with it, but I can't find way to do it. Trying to remove it like in the sample code below doesn't want to work. How could I get to the iterator of current px object in this loop to remove it?

for( Pixel px : pixel){ 
[...]
  if(px.y > gHeigh){
     pixel.remove(pixel.indexOf(px)); // here is the thing
     pixel.remove(px); //doesn't work either
  }
}
2

6 Answers 6

67

You can't, within the enhanced for loop. You have to use the "long-hand" approach:

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

Of course, not all iterators support removal, but you should be fine with ArrayList.

An alternative is to build an additional collection of "pixels to remove" then call removeAll on the list at the end.

Sign up to request clarification or add additional context in comments.

Comments

24

Using and lamdba expressions, the method removeIf has been introduced for collections.

Removes all of the elements of this collection that satisfy the given predicate.

So it will only take one line :

pixels.removeIf(px -> px.y > gHeigh);

2 Comments

by the way removeIf uses Iterator and while loop. You can see it at java 8 java.util.Collection.java
@omerhakanbilici This is only the default implementation. You can see it has been optimized for ArrayLists for instance.
2

You cannot modify a Collection while someone is iterating over it, even if that someone were you. Use normal for cycle:

for(int i = 0; i < pixel.size(); i++){
    if(pixel.get(i).y > gHeigh){
        pixel.remove(i);
        i--;
    }
}

1 Comment

you have the issue of the next loop needing to be on index i again and you need to ensure it is not incremented
2

you need to create and access the iterator explicitly

Iterator<Pixel> it = pixel.iterator();
while(it.hasNext()){
Pixel.px = it.next();
//...
it.remove();
}

Comments

1

use a regular for loop, the enhanced for loop maintains an iterator, and doesn't allow for removal of objects, or use the iterator explicitly

Edit: see answer of the this question Calling remove in foreach loop in Java

Comments

0

If Pixel is your own custom object then you need to implement the equals and hashcode method for your Pixel object. The indexOf method also finds the index using equals method. Try implementing that and check it out.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.