2012-07-25 144 views
2

有沒有辦法像在數組中那樣爲Java集合中的TreeSet設置大小限制? 例如在我們做陣列,將設置大小設置爲TreeSet

anArray = new int[10]; 
+0

你是什麼意思一個「大小限制」 你能給我們部分代碼嗎? – 2012-07-25 21:27:52

+0

不 - 你可能要檢查這個[FixedSizeSortedSet(http://www.java2s.com/Code/Java/Collections-Data-Structure/FixedSizeSortedSet.htm) - 不能保證它是免費的錯誤...其實它不覆蓋這樣的addAll可能無法按預期工作... – assylias 2012-07-25 21:31:56

回答

0

最接近你可以來一個現有的具有容量限制的集合是一個BlockingQueue。將項目添加到隊列時,可以指定零秒(或非常小)的阻塞超時,以便在超過容量時引發異常。有關詳細信息,請參閱BlockingQueue.offer()

5

陣列具有在創建時,必須指定一個固定的長度。

一個TreeSet作爲添加元素時,它會自動增長。您無法設置其大小。你只能閱讀它。

3

這種威脅可以幫助您fixed size list in Java

此外,您還可以實現自己的收藏,以添加元素,如果你的極限還未達到

1

TreeSet中的構造函數中沒有指定的初始大小,它生長時元素被添加。而且無法限制數據結構的最大大小。每次添加()一個新元素時,都需要手動檢查它是否超出了允許的最大值。您可以通過實現從TreeSet擴展的子類來指定此行爲,並重寫add(),addAll()以及接收Collection作爲參數的兩個構造函數。

+0

和壓倒一切的拷貝構造函數和中的addAll(可能還有其他人)... – assylias 2012-07-25 21:34:40

+0

感謝@assylias,我更新了我的答案 – 2012-07-25 21:36:22

+0

如圖試圖做到這一點的答案,它不一定是一件容易的事情。通常情況下,如果您設置了9個項目,並且您添加了所有2個的集合,則在決定是否添加全部項目之前,您需要檢查重複項目,在這種情況下,您仍然需要添加一個項目等。 – assylias 2012-07-25 21:39:40

2

您可以隨時自行實施。這是一個讓你開始的例子。你可能會發現你希望相應地調整它:

public class BoundedTreeSet<E> extends TreeSet<E> { 

    private final int limit; 

    public BoundedTreeSet(final int limit) { 
     super(); 
     this.limit = limit; 
    } 

    public BoundedTreeSet(final int limit, final Collection<? extends E> c) { 
     super(c); 
     this.limit = limit; 
    } 

    public BoundedTreeSet(final int limit, final Comparator<? super E> comparator) { 
     super(comparator); 
     this.limit = limit; 
    } 

    public BoundedTreeSet(final int limit, final SortedSet<E> s) { 
     super(s); 
     this.limit = limit; 
    } 

    @Override 
    public boolean add(final E e) { 
     if (size() >= limit) { 
      return false; 
     } 

     return super.add(e); 
    } 

    @Override 
    public boolean addAll(Collection<? extends E> c) { 
     if (size() + c.size() >= limit) { 
      return false; 
     } 

     return super.addAll(c); 
    } 
} 
+0

您的addAll有一個錯誤(如果大小()== N-1和c.size()== 2)。底線:沒有那麼容易讓它無bug +在這種情況下,如果c包含已經在列表中的項目,則實際上可以添加所有(c)... – assylias 2012-07-25 21:36:06

+0

固定。沒有人說這很容易讓它無缺陷;)易於保持無缺陷的東西很小...... – 2012-07-25 21:37:29

+0

乍一看是的。你的addAll仍然是越野車。 – assylias 2012-07-25 21:37:55