Java 将大小设置为TreeSet

Java 将大小设置为TreeSet,java,Java,有没有一种方法可以像我们对数组那样对Java集合中的树集进行大小限制? 例如,在数组中 anArray = new int[10]; 数组具有固定长度,创建数组时必须指定该长度 TreeSet会随着添加元素而自动增长。无法设置其大小。你只能阅读它。这个威胁可以帮助你 此外,您还可以实现自己的集合,以便添加元素如果未达到限制TreeSet的构造函数都没有指定初始大小,它会随着元素的添加而增大。而且无法限制数据结构的最大大小。每次添加()新元素时,都需要手动检查它是否超过了允许的最大大小。您可以通

有没有一种方法可以像我们对数组那样对Java集合中的树集进行大小限制? 例如,在数组中

anArray = new int[10];

数组具有固定长度,创建数组时必须指定该长度

TreeSet
会随着添加元素而自动增长。无法设置其大小。你只能阅读它。

这个威胁可以帮助你


此外,您还可以实现自己的集合,以便添加元素如果未达到限制

TreeSet的构造函数都没有指定初始大小,它会随着元素的添加而增大。而且无法限制数据结构的最大大小。每次添加()新元素时,都需要手动检查它是否超过了允许的最大大小。您可以通过实现从TreeSet扩展的子类并重写add()、addAll()和接收集合作为参数的两个构造函数来指定此行为。

您始终可以自行实现。下面是一个让你开始的例子;您可能会发现您希望相应地调整它:

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);
    }
}
公共类边界树集扩展树集{
私人最终整数限制;
公共边界树集(最终整数限制){
超级();
这个极限=极限;
}

public BoundedTreeSet(final int limit,final Collection最接近具有容量限制的现有集合的是BlockingQueue。向队列中添加项目时,可以指定零秒(或非常小)阻止超时,以便在超出容量时引发异常。有关更多详细信息,请参阅Apache Solr中的
BoundedTreeSet
实现,该实现在尝试插入“完整”集合时保留最大值:

Maven工件可在此处获得:

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

org.apache.solr
solr核
4.6.0

你说的“大小限制”是什么意思?你能给我们部分代码吗?不-你可能想检查一下-不保证它没有bug…实际上它没有覆盖addAll,所以可能无法按预期工作…你的addAll有bug(例如,如果size()=N-1和c.size()=2).底线:使其无bug不是那么容易的+在这种情况下,如果c包含列表中已有的项目,您实际上可以添加所有(c)…已修复。没有人说使其无bug是容易的;)易于保持无bug的东西集非常小…乍一看是的。你的addAll仍然有bug。而且如果你真的使用它,你大概会花5分钟以上的时间来编写类似的东西。这是为了说明,提供一个示例,说明如何实现这样的解决方案。正如我所指出的在答案中,一些调整可能是必要的。我不认为仅仅因为解决方案“困难”应该避免这种情况。在创建工作应用程序所需编程的范围内,我不会说子类化
TreeSet
是最难的事情之一……是的,会发生错误。但是你需要花时间开发和测试,就像其他任何事情一样。正如试图做到这一点的答案所示,这不一定是一件容易的事情事情。通常,如果你设置了9个项目,并且你添加了2个项目的集合,那么在决定是否添加所有项目之前,你需要检查是否存在重复项,在这种情况下,你仍然需要添加一个项目等@assylias是的,有一些实现细节需要处理,但总体思路是:子类TreeSet并对固定大小限制进行编程-如果这符合OP的利益,他必须决定如何处理边缘案件