将设置大小设置为TreeSet

问题描述:

有没有办法像在数组中那样为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

最接近你可以来一个现有的具有容量限制的集合是一个BlockingQueue。将项目添加到队列时,可以指定零秒(或非常小)的阻塞超时,以便在超过容量时引发异常。有关详细信息,请参阅BlockingQueue.offer()

阵列具有在创建时,必须指定一个固定的长度。

一个TreeSet作为添加元素时,它会自动增长。您无法设置其大小。你只能阅读它。

这种威胁可以帮助您fixed size list in Java

此外,您还可以实现自己的收藏,以添加元素,如果你的极限还未达到

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

您可以随时自行实施。这是一个让你开始的例子。你可能会发现你希望相应地调整它:

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

这里是BoundedTreeSet在Apache Solr实现,试图插入时保持最大价值的实现“满”的设置:可用

http://lucene.apache.org/solr/4_6_0/solr-core/org/apache/solr/util/BoundedTreeSet.html

Maven构件在这里:

<dependency> 
    <groupId>org.apache.solr</groupId> 
    <artifactId>solr-core</artifactId> 
    <version>4.6.0</version> 
</dependency>