为什么ArrayList提供无序输出?

时间:2013-08-28 12:11:12

标签: 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));
    }
  }

它给我输出如下

    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)

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

13 个答案:

答案 0 :(得分:50)

你的阵列:

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

答案 1 :(得分:19)

当你从列表或任何集合中删除项目时,你要么使用迭代器,要么使用这样的反向循环。

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

通过向后退,您可以避免在其他答案中记录的增加2个问题。

答案 2 :(得分:9)

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

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

简而言之

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

答案 3 :(得分:9)

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

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

答案 4 :(得分:4)

您的问题是,在删除元素时,您需要调整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。

答案 5 :(得分:0)

索引从0开始,以size - 1

结束

你的循环从1变为大小 - 2

答案 6 :(得分:0)

ArrayList索引从零开始,但你的循环开始在1处删除。添加元素之后你的arraylist看起来像这样:

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

因为你的循环从1开始计数,你将首先删除标记为1的元素,即7。 该列表将如下所示:

0 - 6
1 - 8
2 - 9

然后循环将删除标记为2的元素,现在为9。

因此,两个错误从1开始而不是0,并且在删除某些内容后递增计数器(删除的元素之后的所有元素都将向下移动)。

答案 7 :(得分:0)

在第一次迭代中,我从1开始,所以你的第二个元素被删除了。 7。现在列表已

6
8
9

下一次迭代为2,因此删除了第三个元素9

答案 8 :(得分:0)

这是一个简单的逻辑:

第一次迭代i=1:

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

删除a[i],即a[1]删除7

第二次迭代i=2:

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

删除a[i]删除9

答案 9 :(得分:0)

你的输出是正确的:这是解释。

首次执行循环时,i的值将为1。并执行语句a.remove(1)。删除值7后的位置[1],'8 will be at a [1]的位置。之后i递增并变为2,它将删除a[2]元素9

答案 10 :(得分:0)

循环中i的值经过以下值

0 1 2 3 4

数组的索引值为0,1,2,3

循环将针对值0,1,2,3,4

运行

当删除一个值时,下一个值在索引0处可用时,数组不会显示有序的bcoz

在i = 2时,数组的大小为2,最大索引为1,因此遇到IndexOutofBound异常

使用以下循环:

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

答案 11 :(得分:0)

每当你从arraylist中删除一个元素时,它会删除指定位置的元素。每次arraylist的大小减少时都应该注意这一点。

答案 12 :(得分:0)

我不明白你想要删除什么。如果您要清除列表,请调用clear()方法。如果您尝试删除列表中包含的对象,那么您应该知道ArrayList包含对象,而不是原始的int。添加它们时,您正在执行以下操作:

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

ArrayList中有两个remove方法:

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));