2015-11-06 60 views
1

我試圖寫設置remove方法,但是當我測試它不工作。我做錯了嗎?刪除元素後尺寸不會減小。如何覆蓋Set的移除方法?

public class MySet<T> implements Set<T> { 

    private T[] arrayB; 
    private int elements; 

    @Override 
    public boolean remove(Object f) { 
     T h = (T) f; 
     for (T z : arrayB) { 
      if(z == h) { 
       z = null; 
      } 
     } 
     return true; 
    } 

    @Override 
    public int size() { 
     int count = 0; 
     for(int arr = 0; arr < arrayB.length; arr++){ 
      if(arrayB[arr] != null) { 
       count++; 
      } 
     } 
     return count; 
    } 

測試代碼是:

MySet<Integer> ints = new MySet<Integer>(); 
    for (int i = 0; i < 100; i++) { 
     ints.add(i); 
    } 
    for (int i = 0; i < 100; i += 2) { 
     ints.remove(i); 
    } 
} 
+0

在你的'刪除()',你需要使用'平等的()''而不是'==。接下來,您需要將數組索引設置爲'null',而不僅僅是臨時變量'z'。 – Nayuki

+0

當我使用equals方法時,出現NullPointerException錯誤。我嘗試覆蓋它,但不起作用。 –

回答

1

size方法依賴於元素是否null來決定是否算吧。假設你正試圖在數組中放置一個null,那麼你做錯了。所有你要做的就是分配給nullz,這僅僅是一個局部變量。數組沒有改變。

必須使用傳統的for循環和使用數組訪問表達式分配null到陣列元件。您還需要撥打equals而不是使用==來查找元素。

for (int i = 0; i < array.length; i++) 
{ 
    if (array[i] != null && array[i].equals(h)) 
    { 
     array[i] = null; 
    } 
} 

根據您是否要刪除匹配所有元素,或者只是第一個,你可能會考慮增加ifbreak聲明。

+0

建議:您可以跳過空檢查並寫入等於後向:'h.equals(array [i])' – Nayuki

+0

@NayukiMinase如果'h'爲'null'會怎麼樣? – rgettman

+0

謝謝,這有助於很多。 –