2017-06-12 57 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; 

}