我编写了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)
为什么我会得到这样的输出?
答案 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));