为什么ArrayList提供无序输出?

Amr*_*nge 11 java loops

我编写了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));
    }
  }
Run Code Online (Sandbox Code Playgroud)

它给我输出如下

    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)
Run Code Online (Sandbox Code Playgroud)

为什么我得到这样的输出?

Bor*_*ort 50

你的阵列:

a[0]=6
a[1]=7 <-- i
a[2]=8
a[3]=9
Run Code Online (Sandbox Code Playgroud)

然后你在1处删除,我增加到2:

a[0]=6
a[1]=8
a[2]=9 <-- i
Run Code Online (Sandbox Code Playgroud)

请记住,数组索引从0开始,因此最后一个元素位于a.length - 1

因为循环条件而得到异常i <= a.size(),所以在最后的迭代中:

a[0] = 7
a[1] = 9
  2  <-- i
Run Code Online (Sandbox Code Playgroud)


Gil*_*anc 19

当您从列表或任何集合中删除项目时,您可以使用迭代器,也可以使用这样的反向循环.

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

通过向后移动,可以避免在其他答案中记录的增加2问题.


Pra*_*kar 9

对于第一次迭代,a.remove(i)导致元素7被移除,该元素由remove方法返回.

对于第二次迭代,列表的大小为3,并且您要删除索引2处的元素,即9.删除方法返回9.

简而言之

Iteration | Size of list | index being removed | element removed
----------+--------------+---------------------+----------------
    1     |      4       |          1          |       7   
    2     |      3       |          2          |       9  
Run Code Online (Sandbox Code Playgroud)


tom*_*tom 9

如果您想要一个正向循环来删除所有元素,您可以使用以下代码:

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