Цикл в списке с удалением
for (String fruit : list)
{
if("banane".equals(fruit))
list.remove(fruit);
System.out.println(fruit);
}
Вот цикл с инструкцией удаления.
Во время выполнения я получаю некоторое ConcurrentModificationException, ниже выхода консоли:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at Boucle.main(Boucle.java:14)
abricot
banane
Вопрос: Как удалить какой-либо элемент с помощью цикла?
Ответы
Ответ 1
Вам нужно использовать итератор напрямую и удалить элемент через этот итератор.
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String fruit = iterator.next();
if ("banane".equals(fruit)) {
iterator.remove();
}
System.out.println(fruit);
}
Ответ 2
Это кажется немного сложным, почему бы просто не сделать нормальный цикл? Я думаю, что он выглядит чище и не будет бросать эту ошибку. Просто уменьшай, если ты что-то уберешь. во всяком случае, мои работы. Я думаю, что такие авто-петли больше подходят для удобства кодирования, поэтому, если они не удобны, просто не используйте их.
for (int i = list.size() - 1; i>=0; i--) {
String fruit = list.get(i);
System.out.println(fruit);
if ("banane".equals(fruit)) {
list.remove(fruit);
}
}
Ответ 3
В дополнение к непосредственному использованию Iterator
(который я бы рекомендовал) вы также можете хранить элементы, которые хотите удалить в другом списке.
List<String> toRemove = new ArrayList<String>();
for (String fruit : list) {
if ("banane".equals(fruit))
toRemove.add(fruit);
System.out.println(fruit);
}
for (String fruit : toRemove) {
list.remove(fruit);
}
Помните, я не рекомендую это, это просто альтернатива.:)
Ответ 4
Используйте цикл for и перебирайте коллекцию в обратном порядке. (Это означает, что начните с последнего элемента, а цикл - в первый элемент.
Поступая таким образом, вы не получите проблем с помощью индексов, которые меняются из-за удаления элементов из коллекции.
Вы получаете исключение в примере, который вы публикуете, потому что список, по которому итератор итерации итерации, изменился, что означает, что итератор становится недействительным.
Ответ 5
for(Iterator<String> iter = list.iterator(); iter.hasNext(); )
{
String fruit = iter.next();
if("banana".equals(fruit))
iter.remove();
System.out.println(fruit);
}
Ответ 6
Подобно тому, что предложил Бомбе, но в меньших строках кода, повторяя копию списка, но удаляя из исходного списка;
List<String> temp = new ArrayList<String>(list);
for (String fruit : temp)
{
if("banane".equals(fruit))
list.remove(fruit);
System.out.println(fruit);
}
Лично я думаю, что это выглядит лучше, чем итерация с помощью итератора.
Ответ 7
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
if (s.equals("a")) {
iter.remove();
}
}
- лучший подход.