Re: Modify collection inside iteration
obaqueiro@gmail.com wrote:
ArrayList<MyObject> objects = new ArrayList<MyObject>().
[...]
for (MyObject obj: this.objects) {
if (obj.getFlag()==true){
objects.remove(obj);
}
}
That may or may not throw ConcurrentModificationException (best efforts
doesn't mean the implementation tries that hard).
Some of your options, in descending order of merit, are:
private final List<MyObject> objects = new ArrayList<MyObject>();
....
for (
Iterator<MyObject> iter=this.objects.iterator();
iter.hasNext();
) {
if (obj.getFlag()) {
iter.remove();
}
}
// Nice and exception-safe, but can't use final.
private List<MyObject> objects = new ArrayList<MyObject>();
....
final List<MyObject> objectsLocal = new ArrayList<MyObject>();
for (MyObject obj: this.objects) {
if (!obj.getFlag()) {
objectsLocal.add(obj);
}
}
this.objects = objectsLocal;
// Full copy, but not even exception-safe.
private final List<MyObject> objects = new ArrayList<MyObject>();
....
for (MyObject obj: new ArrayList(this.objects)) { // or toArray
if (obj.getFlag()) {
this.objects.remove(obj);
}
}
// Expensive writes, and even reads are more expensive.
private final List<MyObject> objects =
new CopyOnWriteArrayList<MyObject>();
....
for (MyObject obj: this.objects) {
if (obj.getFlag()) {
this.objects.remove(obj);
}
}
private final List<MyObject> objects = new ArrayList<MyObject>();
....
final int num = this.objects.size();
BitSet indexes = new BitSet(num);
int index = 0;
for (MyObject obj: this.objects) {
if (obj.getFlag()) {
indexes.set(index);
}
++index;
}
for (int ct=num; --ct>= 0; ) {
if (indexes.get()) {
this.objects.remove(index);
}
}
private final List<MyObject> objects = new ArrayList<MyObject>();
....
final List<Integer> indexes = new ArrayList<Integer>();
int i = 0;
for (MyObject obj: this.objects) {
if (obj.getFlag()) {
indexes.add(i);
}
++i;
}
Collections.reverse(indexes);
for (int index : indexes) {
this.objects.remove(index);
}
[ObDisclaimer: Not even compiled, let alone tested.]
Tom Hawtin