Java ArrayList中断删除
我试图编写一段代码,删除整数数组列表中第一个非零元素(从索引0扫描)之前的所有零。但是,代码会在第一个非零元素之后不断删除固定数量的零。有人能找出原因吗?(对不起,若问题的格式不理想,这是我第一次。) 对于以下代码,预期输出为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 =
[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()会减少所有连续元素的索引。