Une question très simple et rapide sur les bibliothèques Java: existe-t-il une classe prête à l'emploi qui implémente un Queue
avec une taille maximale fixe - c'est-à-dire qu'elle permet toujours l'ajout d'éléments, mais elle supprimera silencieusement les éléments head pour accueillir l'espace pour les éléments nouvellement ajoutés.
Bien sûr, il est trivial de l'implémenter manuellement:
import java.util.LinkedList;
public class LimitedQueue<E> extends LinkedList<E> {
private int limit;
public LimitedQueue(int limit) {
this.limit = limit;
}
@Override
public boolean add(E o) {
super.add(o);
while (size() > limit) { super.remove(); }
return true;
}
}
Pour autant que je vois, il n'y a pas d'implémentation standard dans stdlibs Java, mais peut-être qu'il y en a une dans Apache Commons ou quelque chose comme ça?
collections
queue
java
GreyCat
la source
la source
Réponses:
Apache commons collections 4 a un CircularFifoQueue <> qui est ce que vous recherchez. Citant le javadoc:
Si vous utilisez une ancienne version des collections communes Apache (3.x), vous pouvez utiliser CircularFifoBuffer qui est fondamentalement la même chose sans génériques.
Mise à jour : réponse mise à jour après la publication de la version 4 des collections communes qui prend en charge les génériques.
la source
EvictingQueue
ajouter à la version 15 de Google Guava vers 2013-10.La goyave a désormais une EvictingQueue , une file d'attente non bloquante qui expulse automatiquement les éléments de la tête de la file d'attente lors de la tentative d'ajouter de nouveaux éléments dans la file d'attente et elle est pleine.
la source
EvictingQueue
est un FIFO. En cas de doute, essayez ce programme:Queue<Integer> fifo = EvictingQueue.create(2); fifo.add(1); fifo.add(2); fifo.add(3); System.out.println(fifo);
Observez le résultat:[2, 3]
J'aime la solution @FractalizeR. Mais je voudrais en plus garder et retourner la valeur de super.add (o)!
la source
LinkedList
n'est pas sûr pour les threads ne serait pas inutile non plus. dans le contexte de cette question, l'exigence spécifique de l'OP rend particulièrement important que l'ajout d'un article soit effectué comme une opération atomique. en d'autres termes, le risque de ne pas garantir l'atomicité serait plus important que dans le cas d'une LinkedList régulière.add(int,E)
place. Et si celaaddAll
fonctionne comme prévu, dépend de détails d'implémentation non spécifiés. C'est pourquoi vous devriez préférer la délégation à l'héritage…Utilisez la composition et non les étendues (oui, je veux dire les étendues, comme dans une référence au mot clé extend en java et oui, c'est l'héritage) La composition est supérieure car elle protège complètement votre implémentation, vous permettant de modifier l'implémentation sans impact sur les utilisateurs de votre classe.
Je recommande d'essayer quelque chose comme ça (je tape directement dans cette fenêtre, donc l'acheteur se méfie des erreurs de syntaxe):
Une meilleure option (basée sur la réponse d'Asaf) pourrait être d'encapsuler Apache Collections CircularFifoBuffer avec une classe générique. Par exemple:
la source
LinkedList
est implémenté, alors. L'objet supplémentaire créé comme enveloppe autour de la liste sera assez mineur, même avec "des dizaines de millions" d'instances.La seule chose que je sais qui a un espace limité est l'interface BlockingQueue (qui est par exemple implémentée par la classe ArrayBlockingQueue) - mais ils ne suppriment pas le premier élément s'il est rempli, mais bloquent plutôt l'opération put jusqu'à ce que l'espace soit libre (supprimé par un autre thread) ).
À ma connaissance, votre implémentation triviale est le moyen le plus simple d'obtenir un tel comportement.
la source
BlockingQueue
n'est pas une réponse. J'ai pensé à d'autres bibliothèques courantes, comme Apache Commons, les bibliothèques d'Eclipse, Spring, les ajouts de Google, etc.?Vous pouvez utiliser une MinMaxPriorityQueue de Google Guava , à partir du javadoc:
la source
Map
comporter comme unList
. Mais les deux idées montrent une incompréhension complète des algorithmes et de la conception de logiciels.MinMaxPriorityQueue
en ce que veut l'OP est plus trivial que de modifier unLinkedList
(le code de l'OP ne s'en approche même pas).long
type de curseur descendant dans ma propre suggestion, disant qu'il serait suffisamment large dans la pratique, même si théoriquement vous pouvez ajouter plus de 2 ^ 64 objets à cette file d'attente, point auquel la solution se décomposerait .Un LRUMap est une autre possibilité, également d'Apache Commons.
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/LRUMap.html
la source
la source