相交后远程从arraylist中删除项目

时间:2015-01-10 13:45:45

标签: java arraylist

我正在开发一个游戏项目。到目前为止这么好,但我只是坚持ome基本的东西,我无法找到解决方案,并使其正常工作。我决定来这里问你一些建议。

问题:

当玩家接触钻石时,我想从水平和包含世界上所有物体的arraylist中移除钻石。总是会发生我在调用remove()方法后得到异常错误消息。

CODES: 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类调用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());
               }
            }
        }
} 

ERROR:

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代码块。这与我为测试创建的中性列表很有效。我把我不想删除的所有项目都放到一个新的列表中,而不是用最新的arraylist覆盖旧的arraylist。它没有异常错误。当我对游戏列表做同样想要编辑它时抛出同样的错误。 如果可能存在问题,我也会把渲染代码放在那里......

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);
        }
    }                
}

FIXED: 我改变了起始列表是ListIterator,而不是在将项目添加到ListIterator之前将项目放在arrayList中。所有方法都改为迭代。工作正常:))

1 个答案:

答案 0 :(得分:2)

在迭代列表时,您无法移除对象。

一个选项 - 使用iterator.remove() - 如果使用迭代器进行迭代,而不是使用&#34;增强的for循环&#34;。您需要稍微修改您的循环代码,但功能将相同。

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