2016-07-14 45 views
-2

编写一个消除数字0的所有事件的方法。我写的方法工作,除非在一行中有两个零,我在做什么错误,例如0,7,2,0,0 ,虽然方法输出7,2,0,4运行后,4,0?编写一个名为removeZeros的方法

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); 
     } 
     } 
    } 
    } 
+1

你必须手动减少你的'我'。 – Kaushal28

+0

尝试而不是你的for循环:'int i = list.size() - 1; (i> = 0){... i - ;}' – Blobonat

+2

用手在纸上做:尝试1,0,0,2 –

回答

3

尝试把i--;list.remove(i);

... 
    list.remove(i); 
    i--; 
    ... 
0

Remove方法为的ArrayLists

移除此列表中的指定位置的元素。将 后面的元素左移(从 下标中减去1)。 (Javadocs)

因此,当要删除从在它被写入的代码列表中的一个元素,就已经转移到删除的元素向左右侧的所有元素; i + 1得到转移到位置,但你仍然在循环的末尾增加,所以它有效地跳过列表中的下一个值,这是你注意到以下0。

您在这里有选择。您可以继续循环前进,改变if语句:

if (list.get(i) == 0) { 
    list.remove(i); 
    i--; 
} 

将设置I-1所以当你再次通过循环,是回到其原始值并计算刚刚发生的转换,或者

您可以从列表末尾开始,并按相反的顺序进行处理,在这种情况下,由于您已经通过了这些元素,所以转换并不重要:

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

你可以用一条语句做到这一点如下:

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

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

    } 

使用Collection,进口下列:

import java.util.Collections; 
0

那是因为当你删除一个零,光标还在动。所以它会在零之后跳过元素。要处理此移动,当您移除零时,光标退后一步。添加i--;在list.remove(i)声明之后。

相关问题