首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中保存最后N个元素的大小有限的队列

Java中保存最后N个元素的大小有限的队列
EN

Stack Overflow用户
提问于 2011-03-31 19:09:08
回答 6查看 137K关注 0票数 213

关于Java库有一个非常简单快速的问题:有没有现成的类可以实现一个具有固定最大大小的Queue --也就是说,它总是允许添加元素,但它会默默地删除head元素,以便为新添加的元素腾出空间。

当然,手动实现它是很简单的:

代码语言:javascript
复制
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 stdlib中没有标准实现,但在Apache Commons或类似的东西中可能有一个?

EN

回答 6

Stack Overflow用户

发布于 2013-01-15 00:28:43

我喜欢@FractalizeR解决方案。但是我会另外保留并返回来自super.add(o)的值!

代码语言:javascript
复制
public class LimitedQueue<E> extends LinkedList<E> {

    private int limit;

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

    @Override
    public boolean add(E o) {
        boolean added = super.add(o);
        while (added && size() > limit) {
           super.remove();
        }
        return added;
    }
}
票数 15
EN

Stack Overflow用户

发布于 2011-04-12 23:28:40

使用组合而不是扩展(是的,我指的是扩展,因为在java中引用扩展关键字,是的,这是继承)。组合更优越,因为它完全屏蔽了您的实现,允许您在不影响类用户的情况下更改实现。

我建议尝试这样的方式(我直接在这个窗口中输入,所以买家要小心语法错误):

代码语言:javascript
复制
public LimitedSizeQueue implements Queue
{
  private int maxSize;
  private LinkedList storageArea;

  public LimitedSizeQueue(final int maxSize)
  {
    this.maxSize = maxSize;
    storageArea = new LinkedList();
  }

  public boolean offer(ElementType element)
  {
    if (storageArea.size() < maxSize)
    {
      storageArea.addFirst(element);
    }
    else
    {
      ... remove last element;
      storageArea.addFirst(element);
    }
  }

  ... the rest of this class

一个更好的选择(基于Asaf的答案)可能是用泛型类包装Apache Collections CircularFifoBuffer。例如:

代码语言:javascript
复制
public LimitedSizeQueue<ElementType> implements Queue<ElementType>
{
    private int maxSize;
    private CircularFifoBuffer storageArea;

    public LimitedSizeQueue(final int maxSize)
    {
        if (maxSize > 0)
        {
            this.maxSize = maxSize;
            storateArea = new CircularFifoBuffer(maxSize);
        }
        else
        {
            throw new IllegalArgumentException("blah blah blah");
        }
    }

    ... implement the Queue interface using the CircularFifoBuffer class
}
票数 6
EN

Stack Overflow用户

发布于 2011-04-12 23:05:55

我所知道的唯一空间有限的是BlockingQueue接口(例如,由ArrayBlockingQueue类实现)--但它们不会删除填充的第一个元素,而是阻塞put操作,直到空间释放(由其他线程删除)。

据我所知,您的简单实现是获得此类行为的最简单方法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5498865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档