循环遍历和arraylist并删除指定索引处的元素
我正在尝试练习,我会向一个arraylist添加1000个元素,然后再次从列表中系统地删除它们(通过指定索引)。 这背后的想法是比较LinkedList和ArrayList的性能。
int totalObjects = 0; for(int i = 0; i < 1000; i++) { totalObjects += 1; al.add("Object " + totalObjects); } System.out.println("The Arraylist size is " + al.size());
如果我执行以下操作,只有一半的元素被删除……为什么会这样?
for(int index = 0; index < al.size(); index++) { al.remove(index); } System.out.println("The Arraylist size after removal is " + al.size());
亲切的问候阿里安
发生这种情况是因为您通过删除来更改索引。 如果删除元素0,则元素1现在变为元素0.现在,当您下一次删除1时,这就是过去的元素2,而元素1仍然存在于索引0处。
避免这种情况的最简单方法是从头到尾循环。
或者,您可以继续删除索引0,直到ArrayList为空。
请注意,只需使用clear()
方法即可立即删除所有元素。 在您的代码中,问题是列表在您迭代它的同时被修改,从而有效地减小了它的大小,因此index < al.size()
条件失败。 试试这个:
for (int index = 0, n = al.size(); index < n; index++) al.remove(0);
或者,此解决方案最后删除元素,使其更有效(不再需要复制元素):
for (int idx = al.size() - 1; idx >= 0; idx--) al.remove(idx);
因为在从ArrayList
中删除元素时,其索引正在更新。 因此,您删除位置0处的元素,位置1中的元素现在位于索引0位置。 因此,当您删除索引1处的元素时,您将在原始ArrayList
索引2处移除元素,依此类推。
通过循环查看再次删除元素的位置。 每当你删除元素时,al.size()返回的值减少,而你的索引增加。 这意味着你只会迭代一半你想要的时间。
解决方法是这样做。
int size = al.size(); for(int index = 0; index < size; index++ ) {
然后做工作。 这样大小不会改变。
另一件需要记住的事情是,当您从索引0处的arraylist中删除某些内容时,索引1将成为索引0.因此,从迭代中进行迭代可能更好
int index = al.size(); index >=0 ; index--
删除项目时,它会收缩的列表。
假设您有项目0 1和2
你的指数是0
你删除0,你的索引现在是1,你删除2,因为它现在在索引1。
说得通 ?
通常只有一半的列表为空,因为当您从列表中删除元素时,列表的大小会减小,但索引会增加。 他们在中间见面。 如果你真的想逐个删除元素,并从最后一个元素删除到第一个元素。 我建议你使用:
while (!al.isEmpty()) { al.remove(al.indexOf(al.size()-1)); }