2015-01-10 2 views
-1

Я работаю над игровым проектом. Пока все хорошо, но я просто застрял на основной вещи, и я не могу найти решение и заставить его работать правильно. Я решил приехать сюда и попросить у вас предложений.удаленно удалите предмет из arraylist после пересечения

ПРОБЛЕМА:

Когда игрок приходит в контакт с бриллиантом, я полагаю, чтобы удалить алмаз от уровня и от ArrayList, содержащий все объекты в мире. Что всегда происходит, я получаю сообщение об ошибке исключения после вызова метода 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 класс вызов метода 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, но я havent найти разницу.

EDIT_1: Итак, я понял, как это сделать, но я всегда получаю сообщение об ошибке. Я отредактировал блок кода removeobject. Это сработало хорошо с нейтральным списком, который я создал для тестирования. Я помещаю все элементы, которые я не хочу удалять в новый список, чем оформил старый arraylist с новейшим. Он работал без ошибки исключения. Когда я сделал то же самое с игровым списком, который я хочу отредактировать, он выдал ту же ошибку. Ill положить туда рендер код тоже, если возможно, есть проблема ...

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

ИСПРАВЛЕНО: Ill изменил исходный список ListIterator вместо того, чтобы элементы в ArrayList перед добавлением его в ListIterator. Все методы изменились на итерацию. Работает отлично :)

ответ

2

Вы не можете удалить объект во время итерации по списку.

Один вариант - используйте iterator.remove() - если вы итератор итератором, а не «усиленный для цикла». Вам нужно немного изменить код цикла, но функциональность будет одинаковой.

Другое: сохраните все объекты для удаления в вспомогательном списке и удалите их все в конце цикла.

+0

Ничего себе. Я не знаю об этом вспомогательном списке. Мне нравится эта идея. Я попробую это. – parohy