Java 编写一个名为removeZeros的方法

Java 编写一个名为removeZeros的方法,java,Java,编写一个方法,消除所有出现的数字0。我写的方法是有效的,除非一行中有两个零,否则在方法输出7,2,0,4的情况下运行它之后,我做错了什么,例如0,7,2,0,0,4,0 import java.util.*; public class RemoveZeros { public static void main(String[] args) { Integer[] nums = {0, 7, 2, 0, 0, 4, 0}; ArrayList<Intege

编写一个方法,消除所有出现的数字0。我写的方法是有效的,除非一行中有两个零,否则在方法输出7,2,0,4的情况下运行它之后,我做错了什么,例如0,7,2,0,0,4,0

    import java.util.*;

public class RemoveZeros {

    public static void main(String[] args) {
    Integer[] nums = {0, 7, 2, 0, 0, 4, 0};
    ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(nums));

    removeZeros(list);
    System.out.println(list);
} 
public static void removeZeros(ArrayList<Integer> list) {
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i) == 0) {
            list.remove(i);
        }
      }
    }
  }
import java.util.*;
公共类RemoveZero{
公共静态void main(字符串[]args){
整数[]nums={0,7,2,0,0,4,0};
ArrayList=newArrayList(Arrays.asList(nums));
删除零(列表);
系统输出打印项次(列表);
} 
公共静态void removeZero(ArrayList列表){
对于(int i=0;i
试着把
i--后<代码>列表。删除(i)


ArrayLists的remove方法

删除此列表中指定位置的元素。转移 左侧的任何后续元素(从其 指数)。

因此,当您在编写代码时从列表中删除一个元素时,您已经将所有元素向右移动,将删除的元素i向左移动;i+1被移到位置i,但在循环结束时仍然增加i,因此它实际上跳过了列表中的下一个值,这就是您在下面的0中注意到的值

你在这里有选择。您可以继续循环,并将if语句更改为:

if (list.get(i) == 0) {
    list.remove(i);
    i--;
}
这会将i设置为i-1,所以当你再次循环时,i会回到它的原始值,并解释刚才发生的移位,或者

您可以从列表的末尾开始,然后以相反的顺序遍历,在这种情况下,移位并不重要,因为您已经传递了这些元素:

for (int i = list.size()-1; i >= 0; i--) {
    if (list.get(i) == 0) {
        list.remove(i);
    }
}

您可以使用以下单个语句来完成此操作:

public static void removeZeros(ArrayList<Integer> list) {

    list.removeAll(Collections.singleton(0));

  }
import java.util.Collections;

这是因为当你删除零时,光标仍在移动。因此它将跳过零后面的元素。要处理此问题,请在删除零时将光标向后移动一步。加上我--;在list之后。remove(i)语句。

您必须手动减少
i
。请尝试代替for循环:
int i=list.size()-1;当(i>=0){…i--;}
在纸上手工操作时:尝试1,0,0,2@Blobonat除了
i--
是在循环体之后执行,而不是在循环体之前执行。@Blobonat为什么不像以前那样坚持for循环:
for(int i=list.size()-1;i>=0;i--)
import java.util.Collections;