2017-09-21 153 views
1

我需要一个CircularFifoQueue这样的队列在Apache Commons中,但能够向后迭代元素。 也就是说我需要在固定大小的队列中插入元素并自动删除旧元素。但是我需要从最年轻的元素开始迭代元素。 Java中有没有可用的东西?是否有一个固定大小的Deque,它删除Java中的旧元素?

+0

您是否浏览了实现Java Deque接口的类(https://docs.oracle.com/javase/7/docs/api/java/util/Deque.html)?任何这些类都可以为你工作,因为它们提供了一个descendingIterator()方法,以相反的顺序迭代。 –

+1

但任何Deque都必须有descendingIterator()。尽管如此,我仍然没有发现自动删除旧元素的Deque。 – Alexandr

回答

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); 
    } 
} 
相关问题