19

特定の数の要素をFIFO順に効率的にバッファリングできるデータ構造が必要です。

この質問で述べたように、Apache CommonsにはCircularFifoBufferがありますが、残念ながら生成されていません。いくつかの フォークが存在しますが、それらのメンテナンス状況はわかりません。

Guavaは私のコレクションのニーズに対応するライブラリなので、疑問に思っています。Guavaに良い代替手段はありますか?そうでない場合は、Apache CommonsのCircularFifoBufferに基づいて、プロジェクトに実装する必要がありますか?

4

4 に答える 4

30

Guava15.0以降-EvictingQueueを使用できます

于 2013-05-06T07:41:57.980 に答える
7

グアバではそのようなものは見当たりませんが、、などの容量と、すでにいっぱいになっている場合は古いエントリをチェックForwardingQueueする場所を中心に構築するのはどうですか?ArrayDequeadd()offer()remove()

于 2013-01-09T10:28:43.597 に答える
2

Commons-Collections with Genericsmaven link)は、Apache Collections with Generics(およびワーキングCircularFifoBuffer<E>クラスが含まれている)を使用する場合に使用する方法です。

一方、@ FrankPavageauが言うように、独自のForwardingQueue実装を使用できます。単純なアプローチ(さらに最適化する場所がある)は、次のようになります。

static class BoundedQueue<E> extends ForwardingQueue<E> {

  private final Queue<E> delegate;
  private final int capacity;

  public BoundedQueue(final int capacity) {
    this.delegate = 
        new ArrayDeque<E>(capacity); // specifying initial capacity is optional
    this.capacity = capacity;
  }

  @Override
  protected Queue<E> delegate() {
    return delegate;
  }

  @Override
  public boolean add(final E element) {
    if (size() >= capacity) {
      delegate.poll();
    }
    return delegate.add(element);
  }

  @Override
  public boolean addAll(final Collection<? extends E> collection) {
    return standardAddAll(collection);
  }

  @Override
  public boolean offer(final E o) {
    return standardOffer(o);
  }

}

使用法:

final BoundedQueue<Integer> boundedQueue = new BoundedQueue<Integer>(3);
boundedQueue.add(1);
System.out.println(boundedQueue); // [1]
boundedQueue.add(2);
System.out.println(boundedQueue); // [1, 2]
boundedQueue.add(3);
System.out.println(boundedQueue); // [1, 2, 3]
boundedQueue.add(4);
System.out.println(boundedQueue); // [2, 3, 4]
boundedQueue.addAll(Arrays.asList(5, 6, 7, 8));
System.out.println(boundedQueue); // [6, 7, 8]
((Queue<Integer>) boundedQueue).offer(9);
System.out.println(boundedQueue); // [7, 8, 9]
于 2013-01-09T11:44:30.497 に答える
-2

JavaArrayBlockingQueueは、固定サイズの循環バッファを提供します。

于 2013-01-09T10:32:56.307 に答える