是否有固定大小的队列来删除多余的元素?

c0d*_*d3x 117 java queue

我需要一个固定大小的队列.当我添加一个元素并且队列已满时,它应该自动删除最旧的元素.

Java中是否存在此实现?

Mav*_*rik 105

实际上LinkedHashMap完全符合你的要求.您需要覆盖该removeEldestEntry方法.

具有最多10个元素的队列示例:

  queue = new LinkedHashMap<Integer, String>()
  {
     @Override
     protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest)
     {
        return this.size() > 10;   
     }
  };
Run Code Online (Sandbox Code Playgroud)

如果"removeEldestEntry"返回true,则从地图中删除最旧的条目.

  • 这实际上不执行队列操作,我如何检索最新消息。宾语? (4认同)
  • 获取values() 中的最后一项。 (2认同)

Bas*_*que 62

是的,两个

我自己的重复问题这个正确的答案,我了解到两个:

我有效地使用了番石榴EvictingQueue,效果很好.


Roa*_*tad 18

我只是这样实现了一个固定大小的队列:

public class LimitedSizeQueue<K> extends ArrayList<K> {

    private int maxSize;

    public LimitedSizeQueue(int size){
        this.maxSize = size;
    }

    public boolean add(K k){
        boolean r = super.add(k);
        if (size() > maxSize){
            removeRange(0, size() - maxSize);
        }
        return r;
    }

    public K getYoungest() {
        return get(size() - 1);
    }

    public K getOldest() {
        return get(0);
    }
}
Run Code Online (Sandbox Code Playgroud)


mor*_*itz 17

Java语言和运行时中没有现有的实现.所有队列都扩展了AbstractQueue,其文档明确指出,向完整队列添加元素始终以异常结束.最好(并且非常简单)将Queue包装到您自己的类中以获得所需的功能.

再一次,因为所有队列都是AbstractQueue的子代,所以只需将其作为内部数据类型使用,您应该在几乎没有时间运行灵活的实现:-)

更新:

如下所述,有两个可用的开放实现(这个答案很老,伙计们!),详情请参阅此答案.

  • 使用Queue而不是AbstractQueue ...可能有队列实现接口但不扩展抽象类. (4认同)
  • **更新**现在有两个这样的课程.无需自己编写.请参阅此页面上的[我的回答](http://stackoverflow.com/a/21699069/642706). (2认同)

Leo*_*eon 10

public class CircularQueue<E> extends LinkedList<E> {
    private final int capacity;

    public CircularQueue(int capacity){
        this.capacity = capacity;
    }

    @Override
    public boolean add(E e) {
        if(size() >= capacity)
            removeFirst();
        return super.add(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用方法及测试结果:

public static void main(String[] args) {
    CircularQueue<String> queue = new CircularQueue<>(3);
    queue.add("a");
    queue.add("b");
    queue.add("c");
    System.out.println(queue.toString());   //[a, b, c]

    String first = queue.pollFirst();       //a
    System.out.println(queue.toString());   //[b,c]

    queue.add("d");
    queue.add("e");
    queue.add("f");
    System.out.println(queue.toString());   //[d, e, f]
}
Run Code Online (Sandbox Code Playgroud)


Ber*_*ncı 7

这就是我用Queue包裹做的LinkedList,固定尺寸我在这里给的是2;

public static Queue<String> pageQueue;

pageQueue = new LinkedList<String>(){
            private static final long serialVersionUID = -6707803882461262867L;

            public boolean add(String object) {
                boolean result;
                if(this.size() < 2)
                    result = super.add(object);
                else
                {
                    super.removeFirst();
                    result = super.add(object);
                }
                return result;
            }
        };


....
TMarket.pageQueue.add("ScreenOne");
....
TMarket.pageQueue.add("ScreenTwo");
.....
Run Code Online (Sandbox Code Playgroud)