【问题标题】:Is there a fixed size Deque which removes old elements in Java?是否有一个固定大小的 Deque 可以删除 Java 中的旧元素?
【发布时间】:2018-03-03 04:56:13
【问题描述】:

我需要一个类似CircularFifoQueue in Apache Commons 的队列,但能够向后迭代元素。 IE。我需要在固定大小的队列中插入元素,并自动删除旧元素。但我需要从最年轻的元素开始迭代元素。 Java有什么可用的吗?

【问题讨论】:

  • 您是否浏览过实现 Java Deque 接口 (docs.oracle.com/javase/7/docs/api/java/util/Deque.html) 的类?这些类中的任何一个都可能对您有用,因为它们提供了一个descendingIterator() 方法来以相反的顺序进行迭代。
  • 但是任何 Deque 都必须有 descendingIterator()。我仍然没有找到自动删除旧元素的 Deque。

标签: java collections queue fifo deque


【解决方案1】:

我可以使用这样的东西(还需要重写其他插入方法,如 push、pushLast...)但想听听其他可用的解决方案(如果存在)。

public class ConcurrentFixedSizeLinkedDeque<T> extends ConcurrentLinkedDeque<T> {

    private int sizeLimit = Integer.MAX_VALUE;

    public ConcurrentFixedSizeLinkedDeque() {
    }

    public ConcurrentFixedSizeLinkedDeque(Collection<? extends T> c) {
        super(c);
    }

    public ConcurrentFixedSizeLinkedDeque(int sizeLimit) {
        if(sizeLimit<0) sizeLimit=0;
        this.sizeLimit = sizeLimit;
    }

    public ConcurrentFixedSizeLinkedDeque(Collection<? extends T> c, int sizeLimit) {
        super(c);
        if(sizeLimit<0) sizeLimit=0;
        this.sizeLimit = sizeLimit;
    }

    public int getSizeLimit() {
        return sizeLimit;
    }

    public void setSizeLimit(int sizeLimit) {
        this.sizeLimit = sizeLimit;
    }

    @Override
    public void addFirst(T e){
        while(size()>=this.sizeLimit){
            pollLast();
        }
        super.addFirst(e);
    }

    @Override
    public void addLast(T e){
        while(size()>=this.sizeLimit){
            pollFirst();
        }
        super.addLast(e);
    }
}

【讨论】:

    猜你喜欢
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多