Почему 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)
почему я получаю вывод вроде этого?
Ответы
Ответ 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));