11

我编写了 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)

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

4

13 回答 13

50

你的数组:

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

然后在 1 处移除,i 增加到 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
于 2013-08-28T12:14:32.057 回答
19

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

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

通过倒退,您可以避免其他答案中记录的 2 递增问题。

于 2013-08-28T12:24:52.203 回答
9

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

while(!a.isEmpty())
{
    System.out.println("Removed Elements=>" + a.remove(0));
}
于 2013-08-28T12:37:37.317 回答
9

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

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

简而言之

Iteration | Size of list | index being removed | element removed
----------+--------------+---------------------+----------------
    1     |      4       |          1          |       7   
    2     |      3       |          2          |       9  
于 2013-08-28T12:13:25.477 回答
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。

于 2013-08-28T12:30:18.457 回答
0

在第一次迭代中,我从 1 开始,因此您的第二个元素被删除,即。7. 现在列表有

6
8
9

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

于 2013-08-28T12:15:49.400 回答
0

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

于 2013-08-29T08:03:51.490 回答
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

于 2013-08-28T12:17:47.020 回答
0

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

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

于 2013-08-28T12:17:52.067 回答
0

循环中 i 的值经过以下值

0 1 2 3 4

该数组的索引值为 0 、 1 、 2 、 3

循环将为值 0,1,2,3,4 运行

删除一个值时,数组不按顺序显示 bcoz 下一个值在索引 0 处可用

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

使用以下循环:

    while(a.size()>0)
    {
     System.out.println("Removed Elements=>"+a.remove(0));
    } 
于 2013-08-28T17:50:45.503 回答
0

索引以 0 开头,以 size - 1 结尾

您的循环从 1 变为 size - 2

于 2013-08-28T12:13:48.193 回答
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 开始,并在删除某些内容后递增计数器(删除元素之后的所有元素都将向下移动)。

于 2013-08-28T12:14:38.427 回答
0

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

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));
于 2013-08-31T09:17:53.590 回答