Java - добавление элементов в список при повторении

Я хочу избежать получения ConcurrentModificationException. Как мне это сделать?

Ответы

Ответ 1

Вы можете использовать ListIterator, который поддерживает метод remove/add во время самой итерации.

ListIterator<Book> iter = books.listIterator();
while(iter.hasNext()){
    if(iter.next().getIsbn().equals(isbn)){
        iter.add(new Book(...));
    }
}

Ответ 2

Вместо использования итератора вы можете использовать цикл for с индексом. Например:

int originalLength = list.length();
for (int i = 0; i < originalLength; i++) {
  MyType mt = list.get(i);
  //... processing
  //... insertions
}

Ответ 3

Вы хотите использовать ListIterator. Вы можете получить один из них из любого списка, хотя для эффективности вы, вероятно, хотите получить его от LinkedList.

import java.util.*;
class TestListIterator {
  public static void main(String[]args) {
    List<Integer> L = new LinkedList<Integer>();
    L.add(0);
    L.add(1);
    L.add(2);
    for (ListIterator<Integer> i = L.listIterator(); i.hasNext(); ) {
      int x = i.next();
      i.add(x + 10);
    }
    System.out.println(L);
  }
}

Печать [0, 10, 1, 11, 2, 12].

Ответ 4

Создайте новый список и заполните его.

List<MyType> originalList = ...
List<MyType> newList = new ArrayList<>(originalList);

for(MyType type : originalList)
{
  // Some decisions
  newList.add(new MyType());
}

Ответ 5

Существует три подхода, чтобы избежать превышения исключения

  • Вы можете преобразовать список в массив и затем выполнить итерацию по массиву. Этот подход хорошо подходит для небольшого или среднего размера, но если список большой, то это сильно повлияет на производительность.

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

  • Если вы используете JDK1.5 или выше, вы можете использовать классы ConcurrentHashMap и CopyOnWriteArrayList. Это рекомендуемый подход.