Подтвердить что ты не робот

Почему ArrayList дает неупорядоченный вывод?

Я написал java-программу, чтобы добавить целое число в ArrayList и удалить это целое из ArrayList. но это не дает мне надлежащего результата. вот мой код..

public static void main(String args[])
  {
    ArrayList<Integer> a=new ArrayList<Integer>();

    a.add(6);
    a.add(7);
    a.add(8);
    a.add(9);

    for(int i=0;i<=a.size();i++)
    {

        System.out.println("Removed Elements=>"+a.remove(i));
    }
  }

он дает мне вывод следующим образом

    Removed Elements=>6
Removed Elements=>8
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.remove(ArrayList.java:387)
    at CollectionTemp.main(CollectionTemp.java:19)

почему я получаю вывод вроде этого?

4b9b3361

Ответ 1

Ваш массив:

a[0]=6
a[1]=7 <-- i
a[2]=8
a[3]=9

Затем вы удаляете значение 1, а я увеличивается до 2:

a[0]=6
a[1]=8
a[2]=9 <-- i

Помните, что индексы массива начинаются с 0, поэтому последний элемент находится на a.length - 1

Вы получаете свое исключение, потому что условие цикла i <= a.size(), поэтому на последней итерации:

a[0] = 7
a[1] = 9
  2  <-- i

Ответ 2

Когда вы удаляете элементы из списка или любой коллекции, вы либо используете итератор, либо используете такой обратный цикл.

for (int i = (a.size() - 1); i >= 0; i--) {
    System.out.println("Removed Elements=>" + a.remove(i));
}

Возвращаясь назад, вы избегаете увеличения на 2 проблемы, которые были задокументированы в других ответах.

Ответ 3

для первой итерации a.remove(i) приводит к удалению элемента 7, который возвращается методом remove.

Для второй итерации размер списка равен 3, и вы удаляете элемент с индексом 2, который равен 9. SO remove method возвращает 9.

Короче

Iteration | Size of list | index being removed | element removed
----------+--------------+---------------------+----------------
    1     |      4       |          1          |       7   
    2     |      3       |          2          |       9  

Ответ 4

Если вы хотите, чтобы прямой цикл удалял все элементы, вы могли бы использовать следующий код:

while(!a.isEmpty())
{
    System.out.println("Removed Elements=>" + a.remove(0));
}

Ответ 5

Ваша проблема заключается в том, что при удалении элементов вы изменяете размер ArrayList. Тем не менее, ваш счетчик циклов не обновляется, поэтому вы повторяете границы массива ArrayList.

ArrayList.remove(index) удаляет элемент из массива, а не только содержимое ArrayList, но фактически изменяет размер вашего ArrayList как вы удаляете элементы.

Сначала вы удаляете первый элемент массива ArrayList.

Removed Elements=>6

Здесь список был изменен размером от 4 до 3. Теперь элемент с индексом 0 равен 7.

Затем вы переходите к элементу с индексом 1. Это число 8.

Removed Elements=>8

Здесь ArrayList был изменен до длины 2. Таким образом, в индексе 0 и 1 есть только элементы.

Затем вы переходите к индексу 2.

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.remove(ArrayList.java:387)
    at CollectionTemp.main(CollectionTemp.java:19)

Нет индекса 2, поэтому вы получаете исключение IndexOutOfBoundsException.

Ответ 6

индекс начинается с 0 и заканчивается размером - 1

ваш цикл переходит от 1 к размеру - 2

Ответ 7

Индексы ArrayList начинаются с нуля, но ваш цикл начинает удаляться в 1. После добавления элементов ваш аррайалист выглядит следующим образом:

0 - 6
1 - 7
2 - 8
3 - 9

Поскольку ваш цикл начинает отсчет с 1, вы сначала удалите элемент с меткой 1, который равен 7. После этого список будет выглядеть следующим образом:

0 - 6
1 - 8
2 - 9

Затем цикл удалит элемент с меткой 2, который теперь равен 9.

Таким образом, две ошибки начинаются с 1 вместо 0 и увеличивают счетчик после того, как что-то было удалено (все элементы после удаления элемента будут сдвинуты вниз).

Ответ 8

В первой итерации я начинается с 1, поэтому ваш второй элемент удален, т.е. 7. Теперь список имеет

6
8
9

Следующая итерация равна 2, поэтому удаляется третий элемент 9.

Ответ 9

Это простая логика:

Первая итерация i=1:

a[0]=6,
a[1]=7,
a[2]=8;
a[3]=9;

Удалить a[i] i.e a[1] удаляет 7

Вторая итерация i=2:

a[0]=6
a[1]=7
a[2]=9

Удалить a[i] удаляет 9

Ответ 10

Ваш результат правильный: вот объяснение.

Когда цикл выполняется в первый раз, значение i будет 1. и он выполняет оператор a.remove(1). после удаления значения 7, которое находится в месте [1], '8 will be at a [1]. После этого i увеличивается и становится 2 и удаляет элемент a[2], который равен 9.

Ответ 11

Значение я в цикле проходит через следующие значения

0 1 2 3 4

Массив имеет индекс со значениями 0, 1, 2, 3

Цикл будет работать для значений 0,1,2,3,4

Массив не отображается упорядоченным bcoz, когда одно значение удаляется, следующее значение доступно по индексу 0

В я = 2 размер массива равен 2 и максимальный индекс равен 1, и, следовательно, исключение IndexOutofBound встречается

используйте следующий цикл:

    while(a.size()>0)
    {
     System.out.println("Removed Elements=>"+a.remove(0));
    } 

Ответ 12

всякий раз, когда вы удаляете элемент из arraylist, он удаляет элемент в указанном местоположении. Это нужно указывать каждый раз, когда размер arraylist уменьшается.

Ответ 13

Я не понимаю, что вы пытаетесь удалить. Если вы хотите очистить список, просто вызовите метод clear(). Если вы пытаетесь удалить объекты, содержащиеся в списке, вы должны знать, что ArrayList содержит объекты, а не примитивные int. Когда вы добавляете их, вы делаете следующее:

a.add(Integer.valueOf(6));

В ArrayList есть два метода удаления:

remove(Object o) //Removes the first occurrence of the specified element from this list

и тот, который вы вызываете:

remove(int index) //Removes the element at the specified position in this list

Возможно, вам стоит сначала позвонить:

 a.remove(Integer.valueOf(i));