Java ArrayList——什么';这是怎么回事

Java ArrayList——什么';这是怎么回事,java,arraylist,Java,Arraylist,Java新手,在网上遇到了这个例子。函数removeZeros应该删除ArrayList中所有为零的整数,但由于某些原因,如果它们是连续的,它不会删除它们。我对此感到非常困惑,因为我不明白为什么它不严格删除数组中所有出现的0。原因可能很明显,但我就是看不出来 public static void main(String args[]) { List<Integer> a = new ArrayList<Integer>(); a.add(0);

Java新手,在网上遇到了这个例子。函数removeZeros应该删除ArrayList中所有为零的整数,但由于某些原因,如果它们是连续的,它不会删除它们。我对此感到非常困惑,因为我不明白为什么它不严格删除数组中所有出现的0。原因可能很明显,但我就是看不出来

public static void main(String args[]) 
{
    List<Integer> a = new ArrayList<Integer>();
    a.add(0);
    a.add(0);
    a.add(4);

    System.out.println(a);  // prints [0 , 0 , 4]
    removeZeros(a);
    System.out.println(a);  // prints [0 , 4] ??   why not just [4]?
}

// function to remove all zeros from an integer list
public static void removeZeros(List<Integer> nums) 
{
  for (int i = 0; i < nums.size(); i++)
    if (nums.get(i) == 0)
        nums.remove(i);
}
publicstaticvoidmain(字符串参数[])
{
列表a=新的ArrayList();
a、 加(0);
a、 加(0);
a、 增加(4);
System.out.println(a);//prints[0,0,4]
删除零(a);
System.out.println(a);//打印[0,4]?为什么不只打印[4]?
}
//函数从整数列表中删除所有零
公共静态void removeZero(列表nums)
{
对于(int i=0;i

任何见解都值得赞赏

这是因为一旦删除了第一个零,数组现在看起来像:

[0, 4]
[1, 0, 4, 5, 0]
然后我们移动到索引1,它被设置为4,所以它不会被删除


正如user@Andy Turner所提到的,您应该以相反的顺序迭代数组

第一次迭代,
索引
为0,而
nums
具有:

-> 0
0
4
0
-> 4
第一个
0
被删除

第二次迭代,
index
为1,
nums
具有:

-> 0
0
4
0
-> 4
既然
4=0
,将不会删除任何内容,因此只剩下
[0,4]

说明 这仅仅是因为您的索引逻辑不正确

让我们看一下以下示例:

[1, 0, 0, 4, 5, 0]
我们在索引
1
2
5
中有零。代码开始迭代,索引
0
正常。现在
i=1
我们将使用
list.remove(i)
将其从列表中删除。现在的列表如下所示:

[0, 4]
[1, 0, 4, 5, 0]
现在请注意,索引已更改!剩余的零现在位于索引
1
4
,而不是
2
5
。但是您的循环前进
i
,您检查的下一个元素将是
i=2
,因此您错过了位置
1
处的零

因此问题在于,元素移除会影响循环的索引逻辑


解决方案 一个简单的解决方法是反向执行该过程:

for (int i = nums.size() - 1; i >= 0; i--) {
    if (nums.get(i) == 0) {
        nums.remove(i);
    }
}
因为如果大小减小,它不会影响较低的索引

或者,如果您删除了某些内容,请向前执行,但不要向前执行
i

int i = 0;
while (i < nums.size()) {
    if (nums.get(i) == 0) {
        nums.remove(i);
    } else {
        i++;
    }
}
inti=0;
而(i
for循环应该以相反的顺序迭代。当你迭代列表时,你应该以相反的顺序进行。我建议你寻找更好的例子来学习。@Andy Turner这是我在网上发现的一个计算机科学考试的问题。对不起,我猜“示例”是一个误导性的词:0@alfasin该副本不相关。或者使用
list.removeIf(x->x==0)