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