为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2019-07-19 16:36:22
在Java中保存最后N个元素的有限大小队列关于Java库的一个简单而快速的问题:是否有一个现成的类实现了Queue具有固定的最大大小-也就是说,它总是允许添加元素,但它将悄悄地删除Head元素,以容纳新添加的元素的空间。当然,手动实现它很简单: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;     }}据我所见,Javastdlib中没有标准的实现,但可能在ApacheCommons中有这样的实现吗?
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

ApacheCommonsCollection 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]

如果使用的是ApacheCommons集合的旧版本(3.x),则可以使用CircularFifoBuffer在没有仿制药的情况下,这基本上是一回事。

更新:在发布支持泛型的公用集合版本4之后更新的答案。


查看完整回答
反对 回复 2019-07-19
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

番石榴现在EvictingQueue, 一个非阻塞队列,当试图向队列中添加新元素时,它会自动将元素从队列的头部逐出,并且队列已经满了。

import java.util.Queue;import com.google.common.collect.EvictingQueue;Queue<Integer> fifo = EvictingQueue.create(2); fifo.add(1); fifo.add(2); fifo.add(3); System.out.println(fifo); // Observe the result: // [2, 3]


查看完整回答
反对 回复 2019-07-19
?
www说

TA贡献1775条经验 获得超8个赞

我还会保留并返回Super.Add(O)中的值!

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;
    }}


查看完整回答
反对 回复 2019-07-19
  • 3 回答
  • 0 关注
  • 1097 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信