我希望这会打印[],但会打印[1,3,5,7,9]。任何人都可以解释为什么不删除每个索引? 感谢。
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main (String args[])
{
ArrayList<Integer> aL= new ArrayList<>();
int[] aList = {0,1,2,3,4,5,6,7,8,9,10};
for(int i: aList){
aL.add(i);}
mystery(aL);
System.out.println(aL);
}
public static void mystery(List<Integer> nums)
{
for (int k = 0; k < nums.size(); k++)
{
nums.remove(k);
}
}
}
答案 0 :(得分:4)
每次删除一个元素时,列表会向左移动以从较高的索引中填充该元素,因此当您再增加k时,您将在刚删除的元素之后跳过该元素。您可以从索引0中删除,直到列表为空。
答案 1 :(得分:4)
如果你想从数组中删除所有元素,你必须从最后开始并向后工作,否则你的索引会搞砸。
请考虑您的数组如下:{0, 1, 2, 3}
现在你想循环并删除从第0个索引开始。所以第一个循环发生了,现在你的数组看起来像这样:{1, 2, 3}
。
下次循环时,您正在删除第一个索引,但是这没有考虑到数组向左移动,所以现在您的数组是:{1, 3}
。
我认为你可以看到问题所在。因此,要么继续在索引0处删除nums.remove(0)
,要么可以从数组末尾开始并返回。
答案 2 :(得分:1)
我通常会向后构建for循环以避免此问题。在您想要从列表中偶尔删除多个项目而不必担心重新索引导致您删除错误项目的情况下,它尤其有用。你可以试试这个:
for(int k = nums.size()-1; k >= 0; k--) nums.remove(k);