После того, как мы вызываем list.remove во время итерации массива. Элементы не удаляются. Я получил вывод [2,4]. в чем причина этого?
package com.unisys.geeks.arrays;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.List;
public class RemoveElementFromIteration {
static List<Integer> iterateElements() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
return list;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
List<Integer> list = iterateElements();
System.out.print(list);
}
catch (ConcurrentModificationException e) {
System.out.println(e.getMessage());
}
}
}
2 ответа
удалить (int index)
Удаляет элемент в указанной позиции в этом списке (необязательная операция). Смещает любые последующие элементы влево (вычитает один из их индексов). Возвращает элемент, который был удален из списка.
List = [1,2,3,4]
В первом счетчике цикла (i = 0) вы удаляете элемент с индексом 0, который в вашем случае равен 1.
List = [2,3,4]
При подсчете второго цикла (i = 1) вы удаляете элемент с индексом 1. Но помните, что списки являются динамическими. Так что после того, как вы удалили целое число 1 в вашем списке. Список меняется в размере. Теперь в индексе 1 вы найдете целое число 3. После удаления 3 у вас останется следующее:
List = [2,4]
Теперь счетчик циклов будет увеличен до 2, что делает условие цикла ложным. Вы останетесь со списком
[2,4]
Это потому что твоя петля
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
Выполняется только 2 раза, потому что при вызове метода remove() размер списка уменьшается. Вы можете изменить его на что-то вроде:
static List<Integer> iterateElements() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
int list_size = list.size();
for (int i = 0; i < list_size; i++) {
list.remove(0);
}
return list;
}