Подтвердить что ты не робот

Есть ли эквивалент Guava для Apache Commons CircularFifoBuffer?

Мне нужна структура данных, которая может эффективно буферизовать определенное количество элементов в порядке FIFO.

Как упоминалось в этом вопросе, Apache Commons имеет CircularFifoBuffer, но он, к сожалению, не является генератором. Некоторые вилки существуют, но я не уверен их статуса обслуживания.

Поскольку Guava - это библиотека для моих коллекционных потребностей, мне интересно: есть ли хорошая альтернатива в Guava? Если нет, следует ли его реализовать в моем проекте на основе Apache Commons CircularFifoBuffer?

4b9b3361

Ответ 1

Запуск Guava 15.0 - вы можете использовать EvictingQueue

Ответ 2

Я не вижу ничего подобного в Guava, но как насчет ForwardingQueue, построенного вокруг ArrayDeque, где вы проверяете емкость на add(), offer() и т.д. и remove() старых записей, если она уже заполнена?

Ответ 3

Commons-Collections with Generics (maven link) это путь, если вы хотите использовать Apache Collections с 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]

Ответ 4

Java ArrayBlockingQueue предлагает круглый буфер фиксированного размера.