2014-09-06 100 views
0

我想在陣列中的每個元素左移,如果有一個空值。 E.g如何使用循環移動數組中的每個元素?

public static void main(String[] args) { 
    String asd[] = new String[5]; 
    asd[0] = "zero"; 
    asd[1] = "one"; 
    asd[2] = null; 
    asd[3] = "three"; 
    asd[4] = "four; 

我所要的輸出是

zero, one, three, four. 

長度也應調整

我怎樣才能做到這一點使用循環?我嘗試使用if語句來檢查一個元素是否爲空,並將該值複製到另一個數組中。但我不知道如何複製,如果有一個null。

回答

1

鑑於樣的問題,我想你想要一個簡單的,僅循環和數組只有基礎的解決方案,以瞭解它是如何工作的。

你必須遍歷數組,保持新的插入點的索引。最後,使用相同的索引,你可以「縮小」數組(實際上覆制到一個新的更小的數組)。

String[] arr = {"a","b",null,"c",null,"d"}; 

// This will move all elements "up" when nulls are found 
int p = 0; 
for (int i = 0; i < arr.length; i++) { 
    if (arr[i] == null) continue; 
    arr[p] = arr[i]; 
    p++; 
} 

// This will copy to a new smaller array 
String[] newArr = new String[p]; 
System.arraycopy(arr,0,newArr,0,p); 

剛剛測試過這段代碼。

編輯:

關於陣列收縮的可能性,而無需使用System.arraycopy,不幸的是在Java數組它們被實例化時的尺寸必須被聲明,並且之後不能被改變(也沒有取得較大也不小) 。

所以,如果你有長度爲6的數組,並找到2個空,你有沒有它縮小爲4的長度,如果沒有創建一個新的空數組,然後複製元素的方式。

列表可以擴展和收縮,並且更加得心應手。例如,與列表相同的代碼將是:

String[] arr = {"a","b",null,"c",null,"d"}; 
List<String> list = new ArrayList<>(Arrays.asList(arr)); 
Iterator<String> iter = list.iterator(); 
while (iter.hasNext()) if (iter.next() == null) iter.remove(); 
System.out.println(list); 
+0

您好,感謝。雖然我想知道是否可以在for循環中使用system.arraycopy而不是使用system.arraycopy?除非你願意,否則你不需要執行代碼,但如果可能的話,你可以給我一個關於我應該怎麼做的快速概念? – user2775042 2014-09-06 14:34:23

+0

編輯後解釋爲什麼你需要System.arraycopy如何,而不是列出的工作。 – 2014-09-06 14:41:50

+0

感謝您的解釋 – user2775042 2014-09-06 14:46:46

1

嘗試:

int lengthNoNull = 0; 
for(String a : asd) { 
    if(a != null) { 
     lengthNoNull++; 
    } 
} 
String[] newAsd = new String[lengthNoNull]; 
int i = 0; 
for(String a : asd) { 
    if(a != null) { 
     newAsd[i++] = a; 
    } 
} 
0

的只使用陣列碼片。

String[] x = {"1","2","3",null,"4","5","6",null,"7","8","9"}; 
    String[] a = new String[x.length]; 
    int i = 0; 
    for(String s : x) { 
     if(s != null) a[i++] = s; 
    } 
    String[] arr = Arrays.copyOf(a, i); 

或者這樣:

String[] xx = {"1","2","3",null,"4","5","6",null,"7","8","9"}; 
    int pos = 0, i = 0; 
    String tmp; 
    for(String s : xx) { 
     if(s == null) { 
      tmp = xx[pos]; 
      xx[pos] = s; 
      xx[i] = tmp; 
      pos++; 
     } 
     i++; 
    } 
    String[] arr = Arrays.copyOfRange(xx, pos, xx.length); 
相關問題