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