2015-12-02 4 views
2

Я сделал небольшую игру, которая рисует врагов на экране, а враги - из ArrayList. Экран перерисовывается так, что враги также могут двигаться. Я делаю это с помощью этого кода:Удаление материала из ArrayList с помощью итератора при его использовании

for (Meteor m : getMeteorArrayList()) { 
    if (m.getVisible()) 
    { 
     canvas.drawBitmap(m.getImg(), m.getX(), m.getY(), p); 
    } 
    else 
    { 
     Iterator<Meteor> iter = getMeteorArrayList().iterator(); 
     while (iter.hasNext()) 
     { 
      if (iter.next() == m) 
      { 
       iter.remove(); 
      } 
     } 

    } 

} 

Но это создает проблему. Если я убью врага, я хочу, чтобы он был удален из ArrayList. Я знаю, что могу установить его в NULL, но тогда он все еще существует. Для этого я использую Iterator, как вы можете видеть в коде выше.

Проблема в том, что если экран перерисовывается после я удалил врага сбой приложения с этой ошибкой:

java.util.ConcurrentModificationException 
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 

Я думаю, это потому, что я вдруг дыру в моей ArrayList на месте где был враг. Как это сделать, чтобы я мог удалить что-то из ArrayList и все равно получить доступ к остальным?

+0

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

+0

Извините, я пропустил суть. Я только улучшил предыдущее редактирование, потому что он по-прежнему содержит неправильную грамматику. – Bnrdo

+0

@onepotato Вы приняли рассмотренное редактирование, и вам нужно было вернуть большую часть редактирования, чтобы исправить его. Вы по-прежнему можете принимать такие изменения, но лучше отказаться от них и редактировать только недостающие части, без необходимости возвращать неправильный материал рассмотренного редактирования. Это то, что я имел в виду. – Tom

ответ

5

Ваша проблема в том, что вы повторяете этот список дважды - один раз неявно (с расширенным циклом) и второй раз с явным итератором. Если вы используете только явный итератор, вы сможете удалить элемент из списка.

Iterator<Meteor> iter = getMeteorArrayList().iterator(); 
    while (iter.hasNext()) { 
     Meteor m = iter.next(); 
     if (m.getVisible()) { 
      canvas.drawBitmap(m.getImg(), m.getX(), m.getY(), p); 
     } else { 
      iter.remove(); 
     } 
    } 
+0

Я чувствую себя глупо сейчас, хахаха, thnx для разрежения – Zeepblok

1

Я хотел бы использовать только Итератор

Iterator<Meteor> iter = getMeteorArrayList().iterator(); 
while (iter.hasNext()) { 
    Metor m = iter.next(); 
    if (m.getVisible()) { 

    } else { 

    } 
} 

исключение, вероятно, вызвано тем, что вы перебор два раза за тот же список

+0

Я чувствую себя глупо сейчас, хахаха, thnx для разрешения – Zeepblok

Смежные вопросы