После того, как мы вызываем 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;
}
Другие вопросы по тегам