2015-10-20 61 views
2

我試圖創建一個方法,將數組中的變量elt的每個實例設置爲null,然後將每個變量往左邊。我寫的當前代碼只將變量的第一個實例設置爲null,並將所有其他變量移到左側,但不會將其他任何elt實例設置爲null。我到目前爲止的代碼如下。如何設置數組中的某些變量的每個實例爲空,並將每個變量左移

public T remove(T elt) { 
     boolean exist = false; 

     for (int i=0; i<data.length; i++) { 

      if (data[i] == elt) { 
       data[i] = null; 
       size--; 
       exist = true; 

       for (++i; i < data.length; i++) { 
        data[i-1] = data[i]; 
       } 
      } 
     } 

     if (exist == true) 
      return elt; 
     else 
      return null; 
    } 

在主,我有以下代碼:

public static void main(String[] args) { 
     Bag<String> sbag = new Bag<String>(); 

     sbag.add("Noriko"); 
     sbag.add("hello"); 
     sbag.add("Buddy"); 
     sbag.add("Mary"); 
     sbag.add("Peter"); 
     sbag.add("hello"); 

     sbag.remove("hello"); 

當我打印陣列,我希望以下的輸出:

酒井法子 好友 瑪麗 彼得

相反,我得到:

酒井法子 好友 瑪麗 彼得 你好

這告訴我,它只是設置的ELT的第一個實例爲null,每一個變量向左移動,和停止。任何人都可以告訴我如何修復我的代碼,以便設置變量elt null的每個實例?

回答

1

你的innner和outer loop都使用變量i。當找到第一個匹配項時,記錄被刪除,並且i增加到data.length(將剩餘記錄移到左側時)。當您回到外部循環時,i = data.length和外部循環終止。

你應該爲你的內循環使用一個不同的變量。

+0

我會贊成票的問題的很好的說明,而是由dasblinkenlight答案修復(未說明)的非線性響應時間的問題了。 – Andreas

1

從你的代碼的外觀看起來你會想要使用「列表」類型。

有了這個,你可以添加和刪除變量,而不必編寫一個完整的新函數來完成它。

4

的常用技術的「刪除所有與轉變」問題是單獨的索引做這一切在一個環路 - 一個用於讀取,一個用於寫入:

int rd = 0, wr = 0; 
while (rd != data.length) { 
    if (data[rd] != elt) { // Shouldn't you use equals() instead? 
     data[wr++] = data[rd++]; 
    } else { 
     rd++; 
    } 
} 
while (wr != data.length) { 
    data[wr++] = null; 
} 

這技術在實踐中非常有用。我強烈建議你用紙和鉛筆做一兩個例子,以確保你完全理解它。

+1

謝謝!這是非常豐富的信息,並教我很多。我真的很感謝這也解決了非線性響應時間問題。 –

1

爲了鍛鍊; Tibial的緣故:

public T remove(T elt) { 
    boolean exist = false; 

    for (int i=0; i<size; i++) { // changed data.length to size to avoid unnecessary iterations over deleted positions 

     while (data[i] == elt) { // changed if to while 
      data[i] = null; 
      size--; 
      exist = true; 

      for (int j = i+1; j < data.length; j++) { // changed iteration variable, we don't want to move i 
       data[j-1] = data[j]; 
      } 
     } 
    } 

    if (exist == true) 
     return elt; 
    else 
     return null; 
} 
+0

我提高了dasblinkenlight的解決方案,但我發現它好多了。 –

+0

非常感謝您的幫助。我非常感謝你的解決方案,因爲它有助於澄清我原來的代碼中的錯誤。我也非常感謝@dasblinkenlight的解決方案,因爲它教會了我新的東西。只是一個有趣的觀察,代碼不起作用,因爲你上面寫的。如上所述,它實際上刪除了數組中的每個項目。我將while循環改回到我原來在OP中的if語句,現在代碼完全按照我原先的想法工作。你寫的第二個for循環雖然幫了我很多! –

+0

@Omar有趣。另外,我認爲代碼並沒有正確地刪除複製到左邊的元素(除非最後一個元素實際上是匹配),那麼在'for'循環之後應該有'data [data.length - 1] = null' 。當兩個「你好」之間沒有任何內容時,你應該檢查它的作用,以及如果最後一個元素不匹配'elt'會怎樣。 –

相關問題