2017-09-21 6 views
1

J'ai besoin d'une file d'attente comme CircularFifoQueue dans Apache Commons mais avec la capacité d'itérer les éléments vers l'arrière. I.e. J'ai besoin d'insérer des éléments dans une file d'attente de taille fixe avec la suppression automatique des anciens éléments. Mais j'ai besoin d'itérer les éléments à partir de l'élément le plus jeune. Y a-t-il quelque chose de disponible en Java?Existe-t-il un Deque à taille fixe qui supprime les anciens éléments de Java?

+0

Avez-vous regardé à travers les classes qui implémentent l'interface Java Deque (https://docs.oracle.com/javase/7/docs/api/java/util/Deque.html)? Chacune de ces classes peut fonctionner pour vous car elles fournissent une méthode descendingIterator() pour, bien, parcourir dans l'ordre inverse. –

+1

Mais n'importe quel Deque doit avoir descendingIterator(). Pourtant, je n'ai pas trouvé Deque avec auto-suppression des éléments anciens. – Alexandr

Répondre

1

Je peux utiliser quelque chose comme ça (il faut aussi réécrire d'autres méthodes d'insertion comme push, pushLast ...) mais j'aimerais entendre d'autres solutions disponibles (si elles existent).

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