相交后从 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" 进行迭代。您需要稍微修改一下循环代码,但功能是一样的。

另一个:将所有要删除的对象存储在辅助列表中,并在循环结束时将它们全部删除。