Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList中断删除_Java_Arraylist - Fatal编程技术网

Java ArrayList中断删除

Java ArrayList中断删除,java,arraylist,Java,Arraylist,我试图编写一段代码,删除整数数组列表中第一个非零元素(从索引0扫描)之前的所有零。但是,代码会在第一个非零元素之后不断删除固定数量的零。有人能找出原因吗?(对不起,若问题的格式不理想,这是我第一次。) 对于以下代码,预期输出为[2 0 0 0 0],但收到的输出为[2 0 0] class Zeroeliminator { public static void main(String args[]) { ArrayList < Integer > arr =

我试图编写一段代码,删除整数数组列表中第一个非零元素(从索引0扫描)之前的所有零。但是,代码会在第一个非零元素之后不断删除固定数量的零。有人能找出原因吗?(对不起,若问题的格式不理想,这是我第一次。) 对于以下代码,预期输出为
[2 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();
    }
}
类消零器{
公共静态void main(字符串参数[]){
ArrayListarr=新的ArrayList();
arr.add(0);//A
arr.add(2);
对于(int i=2;i<7;i++)
arr.add(0);
System.out.println(arr.size());
对于(int i=0;iitr=arr.ListIterator(0);
while(itr.hasNext()){
System.out.print(itr.next()+);
}
System.out.println();
}
}

删除元素时必须减小
i
,因为删除元素之后的
ArrayList
元素的索引会减小

for(int i = 0; i < arr.size(); i++)
{
    if(arr.get(i) != 0){
        break;
    }
    System.out.println(arr.get(i));
    arr.remove(i);   
    i--;   
}
for(int i=0;i
删除元素时必须减小
i
,因为删除元素之后的
ArrayList
元素的索引会减小

for(int i = 0; i < arr.size(); i++)
{
    if(arr.get(i) != 0){
        break;
    }
    System.out.println(arr.get(i));
    arr.remove(i);   
    i--;   
}
for(int i=0;i
代码的问题是,当您删除一个元素时,它之后的所有元素都下移一位。因此,一次迭代的状态如下所示:

arr=[0 2 0 0], i = 0
         // Remove element i
arr=[2 0 0], i = 0
         // Increment i
arr=[2 0 0], i = 1
在下一次迭代中,您将检查i=1,并忽略其中有一个2的事实,因为您从未读取它的值

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

while (!arr.isEmpty() && list.get(0) == 0) {
  arr.remove(0);
}

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

int i = 0;
while (i < arr.size() && arr.get(i) == 0) {
  i++;
}
arr.subList(0, i).clear();
inti=0;
而(i
从ArrayList前面删除1个元素是O(大小),因为所有其他元素都必须下移1;因此,删除多个元素就是O(#删除*大小)


使用sublist的方法一次完成所有移位,因此它是O(大小)。

代码的问题是,当您删除一个元素时,它之后的所有元素都下移了一位。因此,一次迭代的状态如下所示:

arr=[0 2 0 0], i = 0
         // Remove element i
arr=[2 0 0], i = 0
         // Increment i
arr=[2 0 0], i = 1
在下一次迭代中,您将检查i=1,并忽略其中有一个2的事实,因为您从未读取它的值

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

while (!arr.isEmpty() && list.get(0) == 0) {
  arr.remove(0);
}

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

int i = 0;
while (i < arr.size() && arr.get(i) == 0) {
  i++;
}
arr.subList(0, i).clear();
inti=0;
而(i
从ArrayList前面删除1个元素是O(大小),因为所有其他元素都必须下移1;因此,删除多个元素就是O(#删除*大小)


使用sublist的方法一次完成所有移位,因此它是O(大小)。

如果删除一个元素,则所有元素都会随之移位1…是否要删除第一个非零元素之前或之后的所有零?您的问题来自这样一个事实,即在遍历数组时尝试对数组进行变异(请参见下面的Eran解释)。这里有一个友好的建议:不要这样做。相反,请跟踪您应该删除的项目,然后在迭代完数组后删除所有项目(请参见Andy的回答)。如果删除一个元素,则后面的所有元素都会按1移动…是否要删除第一个非零元素之前或之后的所有零?问题在于,您在遍历数组时试图对数组进行变异(请参见下面的Eran说明)。这里有一个友好的建议:不要这样做。相反,跟踪应该删除的项目,然后在迭代完数组后删除所有项目(参见Andy的答案)。可能会生成
ArrayIndexOutOfBoundsException
但在本例中我想我看不出这段代码会导致ArrayIndexOutOfBoundsException的任何方式。大脑放屁,它不会导致它可能会生成
ArrayIndexOutOfBoundsException
,但在本例中我想我看不到这段代码会导致ArrayIndexOfBoundsException的任何方式OutOfBoundsException。Brain fart,它不会导致它感谢快速回复(对于不同的方法更是如此)!是的,我忘了remove()会减少所有连续元素的索引。感谢快速回复(对于不同的方法更是如此)!是的,我忘了remove()会减少所有连续元素的索引。