Java: 从不同的 ArrayLists 同时移除两个对象
Java: removing two objects simultaniously from different ArrayLists
我将对象 Bullet 同时添加到两个 ArrayList 中,下面简要介绍了这些列表。完成某些操作后,我希望从两个列表中删除一个项目符号。这种方法正确吗?我一直收到错误消息:java.util.ConcurrentModificationException
或者,对于以这种方式处理对象,您能想到比 ArrayList 更好的解决方案吗?
//there are ArrayList<Bullet> bullets and ArrayList<Updatable> updatable, in the class
public void removeBullet(Bullet bullet) {
for (ListIterator<Bullet> bulletIterator = bullets.listIterator(); bulletIterator.hasNext();) {
Bullet tempBullet = bulletIterator.next();
if (tempBullet.equals(bullet)) {
for (ListIterator<Updatable> updatableIterator = updatable.listIterator(); updatableIterator.hasNext();) {
Updatable tempUpdatable = updatableIterator.next();
if (tempUpdatable.equals(bullet)) {
updatableIterator.remove();
bulletIterator.remove();
return;
}
}
}
}
}
编辑:问题的根源是我在其中一个列表上使用了一个迭代器,同时在不同的地方,因此出现了错误。此代码适用于可更新列表。
只需使用 ArrayList
删除方法。
bullets.remove(bullet);
和
updatable.remove(bullet);
编辑:
删除ArrayList
:
使用的迭代器方法
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
如您所见,它已经在使用 ArrayList.remove()
方法。
发生 ConcurrentModificationException 是因为您试图从 Iterator 中删除一个项目符号,同时您也在 for 循环中迭代它; java 不喜欢你那样做,会抛出异常。
要解决这个问题,您必须遍历两个迭代器并分别删除它们,或者如 rdonuk 所述,只需使用 ArrayList remove()
方法,如果您尝试删除它不会抛出任何异常ArrayList 中没有的东西;如果对象被删除,它将 return true
,否则 false
,因此您甚至不必检查要删除的对象是否包含在第一个 ArrayList 中地方。
我将对象 Bullet 同时添加到两个 ArrayList 中,下面简要介绍了这些列表。完成某些操作后,我希望从两个列表中删除一个项目符号。这种方法正确吗?我一直收到错误消息:java.util.ConcurrentModificationException
或者,对于以这种方式处理对象,您能想到比 ArrayList 更好的解决方案吗?
//there are ArrayList<Bullet> bullets and ArrayList<Updatable> updatable, in the class
public void removeBullet(Bullet bullet) {
for (ListIterator<Bullet> bulletIterator = bullets.listIterator(); bulletIterator.hasNext();) {
Bullet tempBullet = bulletIterator.next();
if (tempBullet.equals(bullet)) {
for (ListIterator<Updatable> updatableIterator = updatable.listIterator(); updatableIterator.hasNext();) {
Updatable tempUpdatable = updatableIterator.next();
if (tempUpdatable.equals(bullet)) {
updatableIterator.remove();
bulletIterator.remove();
return;
}
}
}
}
}
编辑:问题的根源是我在其中一个列表上使用了一个迭代器,同时在不同的地方,因此出现了错误。此代码适用于可更新列表。
只需使用 ArrayList
删除方法。
bullets.remove(bullet);
和
updatable.remove(bullet);
编辑:
删除ArrayList
:
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
如您所见,它已经在使用 ArrayList.remove()
方法。
发生 ConcurrentModificationException 是因为您试图从 Iterator 中删除一个项目符号,同时您也在 for 循环中迭代它; java 不喜欢你那样做,会抛出异常。
要解决这个问题,您必须遍历两个迭代器并分别删除它们,或者如 rdonuk 所述,只需使用 ArrayList remove()
方法,如果您尝试删除它不会抛出任何异常ArrayList 中没有的东西;如果对象被删除,它将 return true
,否则 false
,因此您甚至不必检查要删除的对象是否包含在第一个 ArrayList 中地方。