No existe una implementación existente en Java Language and Runtime. Todas las colas extienden AbstractQueue , y su documento establece claramente que agregar un elemento a una cola completa siempre termina con una excepción. Sería mejor (y bastante simple) incluir una cola en una clase propia para tener la funcionalidad que necesita.
Una vez más, debido a que todas las colas son elementos secundarios de AbstractQueue, simplemente utilícelo como su tipo de datos interno y debería tener una implementación flexible ejecutándose en muy poco tiempo :-)
ACTUALIZAR:
Como se describe a continuación, hay dos implementaciones abiertas disponibles (¡esta respuesta es bastante antigua, amigos!), Vea esta respuesta para más detalles.
@ user7294900 Gracias, enlace arreglado. Para su información, Stack Overflow lo invita a realizar tales ediciones directamente a una Respuesta usted mismo. Cualquiera puede editar, no solo el autor original. Stack Overflow está destinado a gustar más de Wikipedia en ese sentido.
Basil Bourque
@BasilBourque sí, pero tales ediciones pueden ser rechazadas incluso por mí al cambiar los enlaces es un área gris
user7294900
18
Acabo de implementar una cola de tamaño fijo de esta manera:
publicclassLimitedSizeQueue<K>extendsArrayList<K>{privateint maxSize;publicLimitedSizeQueue(int size){this.maxSize = size;}publicboolean add(K k){boolean r =super.add(k);if(size()> maxSize){
removeRange(0, size()- maxSize);}return r;}public K getYoungest(){return get(size()-1);}public K getOldest(){return get(0);}}
Estoy de acuerdo con Amhed arriba. Elimine el - 1. De lo contrario, a la capacidad máxima, terminará con una matriz que es maxSize + 1 ya que estamos hablando de 0 basado. Por ejemplo. Si maxSize = 50, al agregar un nuevo objeto, la fórmula removeRange en la publicación original será 51 - 50 - 1 = 0 (es decir, nada eliminado).
Etep
8
Esto es lo que hice con Queueenvuelto LinkedList, tiene un tamaño fijo que doy aquí es 2;
publicstaticQueue<String> pageQueue;
pageQueue =newLinkedList<String>(){privatestaticfinallong serialVersionUID =-6707803882461262867L;publicboolean add(String object){boolean result;if(this.size()<2)
result =super.add(object);else{super.removeFirst();
result =super.add(object);}return result;}};....TMarket.pageQueue.add("ScreenOne");....TMarket.pageQueue.add("ScreenTwo");.....
Esta clase hace el trabajo usando composición en lugar de herencia (otras respuestas aquí) que elimina la posibilidad de ciertos efectos secundarios (como lo cubre Josh Bloch en Essential Java). El recorte de la LinkedList subyacente se produce en los métodos add, addAll y offer.
No está muy claro qué requisitos tiene que lo llevaron a hacer esta pregunta. Si necesita una estructura de datos de tamaño fijo, es posible que también desee ver diferentes políticas de almacenamiento en caché. Sin embargo, dado que tiene una cola, mi mejor conjetura es que está buscando algún tipo de funcionalidad de enrutador. En ese caso, iría con un buffer de anillo: una matriz que tiene un primer y último índice. Cada vez que se agrega un elemento, simplemente incrementa el índice del último elemento, y cuando se elimina un elemento, incrementa el índice del primer elemento. En ambos casos, la adición se realiza por módulo el tamaño de la matriz, y asegúrese de incrementar el otro índice cuando sea necesario, es decir, cuando la cola está llena o vacía.
Además, si se trata de una aplicación de tipo enrutador, es posible que también desee experimentar con un algoritmo como Random Early Dropping (RED), que elimina elementos de la cola al azar, incluso antes de que se llene. En algunos casos, se ha descubierto que RED tiene un mejor rendimiento general que el método simple de permitir que la cola se llene antes de caer.
Respuestas:
No existe una implementación existente en Java Language and Runtime. Todas las colas extienden AbstractQueue , y su documento establece claramente que agregar un elemento a una cola completa siempre termina con una excepción. Sería mejor (y bastante simple) incluir una cola en una clase propia para tener la funcionalidad que necesita.
Una vez más, debido a que todas las colas son elementos secundarios de AbstractQueue, simplemente utilícelo como su tipo de datos interno y debería tener una implementación flexible ejecutándose en muy poco tiempo :-)
ACTUALIZAR:
Como se describe a continuación, hay dos implementaciones abiertas disponibles (¡esta respuesta es bastante antigua, amigos!), Vea esta respuesta para más detalles.
fuente
collection.deque
con un especificadomaxlen
.En realidad, LinkedHashMap hace exactamente lo que quieres. Necesita anular el
removeEldestEntry
método.Ejemplo para una cola con un máximo de 10 elementos:
Si "removeEldestEntry" devuelve verdadero, la entrada más antigua se elimina del mapa.
fuente
Si, dos
De mi propia pregunta duplicada con esta respuesta correcta , aprendí de dos:
EvictingQueue
en Google guayabaCircularFifoQueue
en Apache CommonsHice un uso productivo de la guayaba
EvictingQueue
, funcionó bien.Para instanciar una
EvictingQueue
llamada, utilice el método de fábrica estáticocreate
y especifique su tamaño máximo.fuente
CircularFifoQueue
el enlace está muerto, use en su lugar commons.apache.org/proper/commons-collections/apidocs/org/…Acabo de implementar una cola de tamaño fijo de esta manera:
fuente
removeRange(0, size() - maxSize)
Esto es lo que hice con
Queue
envueltoLinkedList
, tiene un tamaño fijo que doy aquí es 2;fuente
Creo que lo que estás describiendo es una cola circular. Aquí hay un ejemplo y aquí hay uno mejor
fuente
Esta clase hace el trabajo usando composición en lugar de herencia (otras respuestas aquí) que elimina la posibilidad de ciertos efectos secundarios (como lo cubre Josh Bloch en Essential Java). El recorte de la LinkedList subyacente se produce en los métodos add, addAll y offer.
fuente
Uso y resultado de la prueba:
fuente
Suena como una lista ordinaria donde el método add contiene un fragmento adicional que trunca la lista si se hace demasiado larga.
Si eso es demasiado simple, entonces probablemente necesite editar la descripción del problema.
fuente
También vea esta pregunta SO , o ArrayBlockingQueue (tenga cuidado con el bloqueo, esto podría ser no deseado en su caso).
fuente
No está muy claro qué requisitos tiene que lo llevaron a hacer esta pregunta. Si necesita una estructura de datos de tamaño fijo, es posible que también desee ver diferentes políticas de almacenamiento en caché. Sin embargo, dado que tiene una cola, mi mejor conjetura es que está buscando algún tipo de funcionalidad de enrutador. En ese caso, iría con un buffer de anillo: una matriz que tiene un primer y último índice. Cada vez que se agrega un elemento, simplemente incrementa el índice del último elemento, y cuando se elimina un elemento, incrementa el índice del primer elemento. En ambos casos, la adición se realiza por módulo el tamaño de la matriz, y asegúrese de incrementar el otro índice cuando sea necesario, es decir, cuando la cola está llena o vacía.
Además, si se trata de una aplicación de tipo enrutador, es posible que también desee experimentar con un algoritmo como Random Early Dropping (RED), que elimina elementos de la cola al azar, incluso antes de que se llene. En algunos casos, se ha descubierto que RED tiene un mejor rendimiento general que el método simple de permitir que la cola se llene antes de caer.
fuente
En realidad, puede escribir su propio impl basado en LinkedList, es bastante sencillo, simplemente anule el método de agregar y haga el personal.
fuente
Creo que la mejor respuesta coincidente es de esta otra pregunta .
Apache commons collections 4 tiene un CircularFifoQueue que es lo que estás buscando. Citando al javadoc:
fuente
Una solución simple, a continuación es una cola de "cadena"
Tenga en cuenta que esto no mantendrá el orden de los elementos en la cola, pero reemplazará la entrada más antigua.
fuente
Como se recomienda en los OOP, deberíamos preferir la Composición a la Herencia
Aquí mi solución teniendo eso en cuenta.
fuente