154 votes

Existe-t-il une file d'attente de taille fixe qui supprime les éléments excessifs?

J'ai besoin d'une file d'attente avec une taille fixe. Lorsque j'ajoute un élément et que la file d'attente est saturée, l'élément le plus ancien doit être automatiquement supprimé.

Existe-t-il une implémentation pour cela en Java?

124voto

Mavrik Points 1284

En fait, le LinkedHashMap fait exactement ce que vous voulez. Vous devez remplacer la méthode removeEldestEntry .

Exemple pour une file d'attente avec 10 éléments maximum:

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

Si "removeEldestEntry" renvoie la valeur true, l'entrée la plus ancienne est supprimée de la carte.

83voto

Basil Bourque Points 8938

23voto

Roar Skullestad Points 802

Je viens d'implémenter une file d'attente de taille fixe de cette façon:

 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 - 1);
        }
        return r;
    }

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

    public K getOldest() {
        return get(0);
    }
}
 

21voto

moritz Points 1757

Il n'existe pas de mise en œuvre dans le Langage Java et de l'Exécution. Toutes les Files d'attente s'étendre AbstractQueue, et sa doc stipule clairement que l'ajout d'un élément à une pleine file d'attente se termine toujours par une exception. Il serait préférable ( et très simple ) pour envelopper une File d'attente dans une classe de votre choix pour avoir les fonctionnalités dont vous avez besoin.

Encore une fois, parce que toutes les files d'attente sont des enfants de AbstractQueue, il suffit de l'utiliser comme votre intérieur type de données et vous devriez avoir une mise en œuvre souple cours d'exécution dans pratiquement pas de temps :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X