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?
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?
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.
À partir de mon propre double question avec cette réponse correcte, j'ai appris de deux:
EvictingQueue
dans Google Goyave 15CircularFifoQueue
dans Apache Commons
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);
}
}
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 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.