2016-06-27 3 views
-1

Ниже приведен код (удаляется большая часть его для ясности), которая показывает мой вопрос о параллельной модификации списка:Параллельное Список Модификация

for (final Week week : this.demand.getWeeks().getAllWeeks()) { 
    final List<Week> weeksExcludingThisWeek = this.demand.getWeeks().getAllWeeks(); 
    weeksExcludingThisWeek.remove(week); 
} 

Насколько я знал, я удалял ссылки на той же неделе объекта , но в другом списке, чем в цикле for.

Как предотвратить это?

+0

Почему вы объявили недели, в том числе, в качестве окончательного? – saravanakumar

+1

Я установил eclipse, чтобы автоматически устанавливать любые не измененные переменные в качестве окончательных при сохранении. Я считаю полезным наводить точечные нечетные ошибки. –

ответ

2

Собственно скопировать его в новый список перед удалением элемента:

List<Week> weeksExcludingThisWeek = new ArrayList<>(this.demand.getWeeks().getAllWeeks()); 

Вы в настоящее время удаления недели из того же списка, который перебирает.

+0

Отлично, это исправлено. Спасибо, Энди, я приму свой ответ за 8 минут. –

1

Здесь вы используете this.demand.getWeeks().getAllWeeks() для обеих итераций переменной week и внутри для переменной weeksExcludingThisWeek цикла.

Такая же ссылка в двух объектах, что является проблемой. Вы не можете изменить текущий итерационный объект внутри цикла.

Создать новый объект внутри цикла, new ArrayList(this.demand.getWeeks().getAllWeeks())

2

Используйте итератор, чтобы избежать ConcurrentModificationException сек

взглянуть на документы: https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

Вы найдете:

итераторы позволяют абоненту удалить элементы из базовой коллекции во время итерации с четко определенной семантикой

+0

Кажется новым для меня, спасибо за информацию! – saravanakumar