1. ホーム
  2. collections

[解決済み】Javaで最後のN個の要素を保持するサイズ制限のある待ち行列

2022-04-10 01:58:32

質問

Java ライブラリに関する簡単な質問です。 Queue つまり、常に要素の追加を許可しますが、新しく追加された要素のためのスペースを確保するために、先頭の要素を静かに削除します。

もちろん、手動で実装するのは簡単だ。

import java.util.LinkedList;

public class LimitedQueue<E> extends LinkedList<E> {
    private int limit;

    public LimitedQueue(int limit) {
        this.limit = limit;
    }

    @Override
    public boolean add(E o) {
        super.add(o);
        while (size() > limit) { super.remove(); }
        return true;
    }
}

私の見る限り、Java stdlibsには標準的な実装はないようですが、Apache Commonsとかにはあるのかもしれませんね?

どのように解決するのですか?

Apache コモンズコレクション4は CircularFifoQueue<> というのは、あなたが探しているものです。javadocを引用します。

<ブロッククオート

CircularFifoQueue は、固定サイズの先入れ先出しキューで、満杯になると最も古い要素に置き換わります。

    import java.util.Queue;
    import org.apache.commons.collections4.queue.CircularFifoQueue;

    Queue<Integer> fifo = new CircularFifoQueue<Integer>(2);
    fifo.add(1);
    fifo.add(2);
    fifo.add(3);
    System.out.println(fifo);

    // Observe the result: 
    // [2, 3]

Apache コモンズコレクションの古いバージョン(3.x)を使用している場合は CircularFifoBuffer これは基本的にジェネリックスなしで同じものです。

更新 : ジェネリックをサポートするcommons collections version 4のリリースに伴い、回答を更新しました。