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. Это рекомендуемый подход.