2016-07-14 66 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)聲明之後。

相關問題