3

配列の場合と同様に、JavaコレクションのTreeSetにサイズ制限を与える方法はありますか?たとえば、配列では、

anArray = new int[10];
4

6 に答える 6

5

配列の長さは固定されており、作成時に指定する必要があります。

要素を追加すると、 ATreeSetは自動的に大きくなります。サイズは設定できません。読むことしかできません。

于 2012-07-25T21:28:47.097 に答える
3

この脅威は、Javaでサイズリストを修正するのに役立ちます

また、制限に達していない場合に要素を追加するために、独自のコレクションを実装することもできます

于 2012-07-25T21:29:20.843 に答える
2

TreeSetのコンストラクターはいずれも初期サイズを指定せず、要素が追加されると大きくなります。また、データ構造の最大サイズを制限する方法はありません。新しい要素をadd()するたびに、許可されている最大サイズを超えているかどうかを手動で確認する必要があります。この動作を指定するには、TreeSetから拡張するサブクラスを実装し、add()、addAll()、およびパラメーターとしてコレクションを受け取る2つのコンストラクターをオーバーライドします。

于 2012-07-25T21:29:37.287 に答える
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);
    }
}
于 2012-07-25T21:32:47.957 に答える
2

BoundedTreeSetこれがApacheSolrの実装であり、「フル」セットに挿入しようとしたときに最大値を保持します。

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>
于 2013-11-28T17:38:34.300 に答える
0

容量制限のある既存のコレクションに最も近いのはBlockingQueueです。キューにアイテムを追加するときに、ゼロ秒(または非常に小さい)のブロッキングタイムアウトを指定して、容量を超えたときに例外がスローされるようにすることができます。詳細については、BlockingQueue.offer()を参照してください。

于 2012-07-25T22:09:46.177 に答える