相交后从 arraylist 中远程删除项目
remotely remove item from arraylist after intersect
我正在做一个游戏项目。到目前为止一切顺利,但我只是停留在一些基本的事情上,我找不到解决方案并使其正常工作。我决定来这里问问大家的建议。
问题:
当玩家接触到钻石时,我想从关卡和包含世界上所有对象的数组列表中移除钻石。在调用 remove() 方法后,我总是收到一条异常错误消息。
代码:
1.Class 列表:EDIT_1
private ArrayList<AbstractObject> objects = new ArrayList<AbstractObject>();
public void removeObject(String name){
ArrayList<AbstractObject> newest = new ArrayList<AbstractObject>();
ListIterator<AbstractObject> delete=objects.listIterator();
while(delete.hasNext()){
if(name.equals(delete.next().getName())){
delete.remove();
}
else{
delete.previous();
newest.add(delete.next());
}
}
objects=newest;
}
2.Player class 调用 removeObject 方法:EDIT_1
public void playerLogic(){
fallingDown();
for(AbstractObject object : this.getWorld().getListOfObjects()){ <--------ERROR HERE
if(this.intersects(object)){
if(object instanceof FinishZone && points>=getWorld().getDiamondCount()){
if(!(getWorld().getManager().isMoreLevels())){
getWorld().getMenu().openMenu(true);
}
else{
this.getWorld().getManager().nextLevel();
}
}
if(object instanceof Diamond){
points++;
this.getWorld().removeObject(object.getName());
}
}
}
}
错误:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at project.objects.characters.Player.playerLogic(Player.java:77)
at project.objects.characters.Player.update(Player.java:70)
at project.world.World.update(World.java:110)
at project.Main.update(Main.java:122)
at project.Main.run(Main.java:65)
at java.lang.Thread.run(Thread.java:745)
我检查了一些从 arraylist 中删除项目的示例,但我没有发现区别。
EDIT_1:
所以我想出了如何去做,但我总是得到错误。我编辑了 removeobject 代码块。这适用于我为测试创建的中性列表。我将所有我不想删除的项目放入一个新列表中,而不是用最新的列表覆盖旧的数组列表。它没有异常错误。当我对游戏列表做同样的事情时,我想编辑它抛出同样的错误。
如果可能有问题,我也会把渲染代码放在那里...
public void render(Graphics g) {
if(menu.getChoice()==-1){
menu.render(g);
}
else if(menu.getChoice()==0){
g.setColor(Color.white);
for(AbstractObject tempObj : objects){
tempObj.render(g);
}
}
}
已修复:
我将起始列表更改为 ListIterator,而不是在将项目添加到 ListIterator 之前将项目放入 arrayList。所有方法都更改为迭代。工作正常:)
您无法在遍历列表时删除对象。
一个选项 - 使用 iterator.remove()
- 如果你使用迭代器而不是 "enhanced for loop" 进行迭代。您需要稍微修改一下循环代码,但功能是一样的。
另一个:将所有要删除的对象存储在辅助列表中,并在循环结束时将它们全部删除。
我正在做一个游戏项目。到目前为止一切顺利,但我只是停留在一些基本的事情上,我找不到解决方案并使其正常工作。我决定来这里问问大家的建议。
问题:
当玩家接触到钻石时,我想从关卡和包含世界上所有对象的数组列表中移除钻石。在调用 remove() 方法后,我总是收到一条异常错误消息。
代码: 1.Class 列表:EDIT_1
private ArrayList<AbstractObject> objects = new ArrayList<AbstractObject>();
public void removeObject(String name){
ArrayList<AbstractObject> newest = new ArrayList<AbstractObject>();
ListIterator<AbstractObject> delete=objects.listIterator();
while(delete.hasNext()){
if(name.equals(delete.next().getName())){
delete.remove();
}
else{
delete.previous();
newest.add(delete.next());
}
}
objects=newest;
}
2.Player class 调用 removeObject 方法:EDIT_1
public void playerLogic(){
fallingDown();
for(AbstractObject object : this.getWorld().getListOfObjects()){ <--------ERROR HERE
if(this.intersects(object)){
if(object instanceof FinishZone && points>=getWorld().getDiamondCount()){
if(!(getWorld().getManager().isMoreLevels())){
getWorld().getMenu().openMenu(true);
}
else{
this.getWorld().getManager().nextLevel();
}
}
if(object instanceof Diamond){
points++;
this.getWorld().removeObject(object.getName());
}
}
}
}
错误:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at project.objects.characters.Player.playerLogic(Player.java:77)
at project.objects.characters.Player.update(Player.java:70)
at project.world.World.update(World.java:110)
at project.Main.update(Main.java:122)
at project.Main.run(Main.java:65)
at java.lang.Thread.run(Thread.java:745)
我检查了一些从 arraylist 中删除项目的示例,但我没有发现区别。
EDIT_1: 所以我想出了如何去做,但我总是得到错误。我编辑了 removeobject 代码块。这适用于我为测试创建的中性列表。我将所有我不想删除的项目放入一个新列表中,而不是用最新的列表覆盖旧的数组列表。它没有异常错误。当我对游戏列表做同样的事情时,我想编辑它抛出同样的错误。 如果可能有问题,我也会把渲染代码放在那里...
public void render(Graphics g) {
if(menu.getChoice()==-1){
menu.render(g);
}
else if(menu.getChoice()==0){
g.setColor(Color.white);
for(AbstractObject tempObj : objects){
tempObj.render(g);
}
}
}
已修复: 我将起始列表更改为 ListIterator,而不是在将项目添加到 ListIterator 之前将项目放入 arrayList。所有方法都更改为迭代。工作正常:)
您无法在遍历列表时删除对象。
一个选项 - 使用 iterator.remove()
- 如果你使用迭代器而不是 "enhanced for loop" 进行迭代。您需要稍微修改一下循环代码,但功能是一样的。
另一个:将所有要删除的对象存储在辅助列表中,并在循环结束时将它们全部删除。