Est-il fixe la taille de la file d'attente qui supprime les éléments excessives?
J'ai besoin d'une file d'attente avec une taille fixe. Quand j'ajoute un élément à la file d'attente est pleine, il doit supprimer automatiquement le plus ancien élément.
Est-il une implémentation existante pour ce en Java?
- que diriez - stackoverflow.com/a/6058025/1392882
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de mise en œuvre existantes 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.
Une fois de plus, 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 🙂
Mise à JOUR:
Comme indiqué ci-dessous, il y a deux implémentations disponibles (cette réponse est assez vieux, les gens!), voir cette réponse pour plus de détails.
collection.deque
avec un certainmaxlen
.Fait le LinkedHashMap fait exactement ce que vous voulez. Vous devez remplacer la
removeEldestEntry
méthode.Exemple pour une file d'attente, un maximum de 10 éléments:
Si le "removeEldestEntry" renvoie true, l'aîné entrée est supprimée de la carte.
Oui, Deux
De mon propre double question avec cette réponse correcte, j'ai appris de deux:
EvictingQueue
dans Google GoyaveCircularFifoQueue
dans Apache CommonsJ'ai fait de l'utilisation productive de la Goyave
EvictingQueue
, a bien fonctionné.CircularFifoQueue
lien est mort, utilisez plutôt commons.apache.org/proper/commons-collections/apidocs/org/...J'ai juste mis en œuvre une taille fixe de la file d'attente de cette façon:
removeRange(0, size() - maxSize)
C'est ce que j'ai fait avec
Queue
enveloppé avecLinkedList
, Il est résolu de taille moyenne dont je donne ici est 2;Je pense que ce que vous décrivez est une circulaire de la file d'attente. Voici un exemple et voici une mieux un
Cette classe ne comprend le travail à l'aide de la composition à la place de l'héritage (d'autres réponses ici) qui supprime la possibilité de certains effets secondaires (couvertes par Josh Bloch, pour l'Essentiel, Java). Le découpage de la sous-jacentes LinkedList se produit sur les méthodes add,addAll et à offrir.
D'utilisation et résultat du test:
Sonne comme une banale Liste de où la méthode add contient une séquence supplémentaire qui tronque la liste si elle devient trop long.
Si c'est trop simple, alors vous devrez probablement modifier la description du problème.
Voir aussi cette SORTE de question, ou ArrayBlockingQueue (attention sur le blocage, cela peut être dangereux dans votre cas).
Il n'est pas tout à fait clair quelles sont les exigences que vous avez qui vous a amené à poser cette question. Si vous avez besoin d'une taille fixe structure de données, vous pouvez également regarder les différentes stratégies de mise en cache. Cependant, puisque vous avez une file d'attente, ma meilleure supposition est que vous êtes à la recherche d'un certain type de fonctionnalité de routeur. Dans ce cas, j'irais avec un anneau de la mémoire tampon: un tableau qui a un prénom et un index. Chaque fois qu'un élément est ajouté, vous avez juste incrémenter le dernier élément de l'index, et lorsqu'un élément est supprimé, incrémenter le premier index de l'élément. Dans les deux cas, l'addition est effectuée modulo la taille du tableau, et assurez-vous d'incrémenter l'indice lorsque cela est nécessaire, c'est à dire lorsque la file d'attente est vide ou plein.
Aussi, si c'est un routeur de type application, vous pouvez également expérimenter avec un algorithme tel que Random Early Tomber (en ROUGE), ce qui tombe des éléments de la file d'attente de manière aléatoire, même avant qu'il soit rempli. Dans certains cas, le ROUGE a été trouvé pour avoir une meilleure performance globale que la simple méthode de permettre à la file d'attente pour faire le plein avant de laisser tomber.
En fait, vous pouvez écrire votre propre impl basé sur LinkedList, c'est assez simple, suffit de surcharger la méthode add et le personnel.
Je pense que la meilleur réponse est de cette autre question.
Apache commons collections de 4 a un CircularFifoQueue qui est ce que vous cherchez. Citant la javadoc:
Une solution Simple, ci-dessous, une File d'attente de "Chaîne"
Noter que ce ne sera pas maintenir l'Ordre des éléments dans la File d'attente, mais il remplacera l'entrée la plus ancienne.