Java ArrayList break删除

Ved*_*hak 0 java arraylist

我试图编写一个代码,在从索引0扫描的整数ArrayList中的第一个非零元素之前删除所有零.但是,代码继续删除固定的no.在第一个非零元素之后的零.任何人都可以找出原因吗?(对不起,如果发布的问题格式不理想.这是我的第一次.)对于下面的代码,预期的输出是[2 0 0 0 0 0],但收到的输出是[2 0 0]

class Zeroeliminator {
    public static void main(String args[]) {
        ArrayList < Integer > arr = new ArrayList < Integer > ();
        arr.add(0); // A
        arr.add(2);
        for (int i = 2; i < 7; i++)
            arr.add(0);
        System.out.println(arr.size());
        for (int i = 0; i < arr.size(); i++) {
            if (arr.get(i) != 0) {
                break;
            }
            System.out.println(arr.get(i));
            arr.remove(i);
        }
        System.out.println(arr.size());
        ListIterator < Integer > itr = arr.listIterator(0);
        while (itr.hasNext()) {
            System.out.print(itr.next() + " ");
        }
        System.out.println();
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ner 5

您的代码的问题在于,当您删除元素时,其后面的所有元素都会向下移动一个元素.所以,一次迭代的状态如下所示:

arr=[0 2 0 0], i = 0
         // Remove element i
arr=[2 0 0], i = 0
         // Increment i
arr=[2 0 0], i = 1
Run Code Online (Sandbox Code Playgroud)

在下一次迭代中,你将检查i = 1,并忽略那里有2的事实,因为你从未读过它的值.

您可以通过i每次删除元素时递减来解决此问题.但是你根本不需要i,因为你要删除列表前缀.相反,你可以使用:

while (!arr.isEmpty() && list.get(0) == 0) {
  arr.remove(0);
}
Run Code Online (Sandbox Code Playgroud)

更好(更有效)的方法是首先扫描列表以找到第一个非零元素,然后一次删除前面的元素:

int i = 0;
while (i < arr.size() && arr.get(i) == 0) {
  i++;
}
arr.subList(0, i).clear();
Run Code Online (Sandbox Code Playgroud)

从ArrayList的前面删除1个元素是O(大小),因为所有其他元素必须向下移动一个; 所以删除多个元素是O(#removed*size).

使用子列表的方法一次完成所有的移位,因此它是O(大小).