2017-06-12 68 views
-1

所以,我試圖創造有限HashSet,所以每當LimitedHashSet超過1024個元素,它拋出一個Error不問,說明。 這裏是我到目前爲止的代碼,創建有限公司HashSet的

import java.util.HashSet; 
public class LimitedHashSet<E> extends HashSet<E>{ 
    public LimitedHashSet(){ 
     super(); 
    } 

    @Override 
    public int size() { 
     return super.size(); 
    } 

    private class LimitedHashSetError{ 
     LimitedHashSetError(){ 
      if (size() > 1024){ 
       throw new Error("LimitedHashSetError"); 
      } 
     } 
    } 
    public static void main(String[] args) { 
      LimitedHashSet<Integer> lhs = new LimitedHashSet<>(); 
      for (int i = 0; i < 1026 ; i++) { 
       lhs.add(i); 
      } 
     } 
} 

然而,沒有任何反應。

+0

你的類'LimitedHashSetError'應該如何工作?它不在任何地方使用 – ByeBye

+0

@ByeBye的行爲與普通的「HashSet」相似,只是它的元素數量有限。 –

+1

你只是在調用'add(i)'1026次。它應該在哪裏檢查限制? –

回答

4

你永遠不會實例化LimitedHashSetError所以你永遠不會檢查大小。我寧願一個檢查方法,將每add(All)之後調用:

public class LimitedHashSet<E> extends HashSet<E>{ 

    @Override 
    public boolean add(E e) { 
     boolean result = super.add(e); 
     checkSize(); 
     return result; 
    } 

    @Override 
    public boolean addAll(Collection<? extends E> c) { 
     boolean result = super.addAll(c); 
     checkSize(); 
     return result; 
    } 

    private void checkSize() { 
     if (size() > 1024){ 
      throw new Error("LimitedHashSetError"); 
     } 
    } 
} 
+0

這是無效的,因爲你添加後檢查大小 - >如果你發現錯誤你的設置將處於錯誤的狀態 – ByeBye

+0

我想知道這一點,但「規範」沒有指定是否應該添加額外的元素* 。必須添加元素才能超出限制。 –

+1

@ByeBye在這種情況下,您需要檢查要添加的值是否已經在您的設置中,或者如果您的設置保持從1到1024的值並且您添加了1 –

0

您應該重寫兩種方法addAlladd在你的類:

@Override 
public boolean addAll(final Collection<? extends E> c) { 
    boolean a = true; 
    for(final E e: c) { 
     a = a && add(e); 
    } 
    return a; 
} 

@Override 
public boolean add(final E e) { 
    if (size() + 1 > 1024 && !contains(e)){ 
     throw new Error("LimitedHashSetError"); 
    } 
    return super.add(e); 
} 
+1

正如我的答案中所述,您將獲得如果您的集合包含1024個元素並添加現有元素,則會出現錯誤。 –

+0

我編輯過。現在檢查 – ByeBye

+1

我認爲'add()'仍然是錯誤的;它在元素被(可能)添加之前檢查。 –

1

你應該做的:

@Override 
public boolean add(E e) { 
    boolean x = super.add(e); 
    if (size() > 1024) { 
     throw new Error("Limited Hash Set Error"); 
    } 
    return x; 
} 

@Override 
public boolean addAll(Collection<? extends E> c) { 
    boolean x = super.addAll(c); 
    if (size() > 1024) { 
     throw new Error("LimitedHashSetError"); 
    } 
    return x; 

}