Uma pergunta muito simples e rápida nas bibliotecas Java: existe uma classe pronta que implementa uma Queue
com um tamanho máximo fixo - isto é, sempre permite a adição de elementos, mas remove silenciosamente os elementos principais para acomodar espaço para os elementos adicionados recentemente.
Obviamente, é trivial implementá-lo manualmente:
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;
}
}
Até onde eu vejo, não há implementação padrão no stdlibs Java, mas pode haver no Apache Commons ou algo assim?
collections
queue
java
GreyCat
fonte
fonte
Respostas:
O Apache commons collections 4 possui um CircularFifoQueue <> que é o que você está procurando. Citando o javadoc:
Se você estiver usando uma versão mais antiga das coleções comuns do Apache (3.x), poderá usar o CircularFifoBuffer, que é basicamente a mesma coisa sem genéricos.
Atualização : resposta atualizada após o lançamento do commons collections versão 4 que suporta genéricos.
fonte
EvictingQueue
adicionado à versão 15 do Google Guava por volta de 2013-10.O Goiaba agora tem um EvictingQueue , uma fila sem bloqueio que remove automaticamente os elementos do início da fila ao tentar adicionar novos elementos à fila e ela está cheia.
fonte
EvictingQueue
é um FIFO. Em caso de dúvida, tente este programa:Queue<Integer> fifo = EvictingQueue.create(2); fifo.add(1); fifo.add(2); fifo.add(3); System.out.println(fifo);
Observe o resultado:[2, 3]
Eu gosto da solução @FractalizeR. Além disso, eu manteria e retornaria o valor de super.add (o)!
fonte
LinkedList
não é seguro para threads também não faria sentido. no contexto desta pergunta, o requisito específico do OP torna particularmente importante que a adição de um item seja realizada como uma operação atômica. em outras palavras, o risco de não garantir a atomicidade seria maior do que no caso de uma LinkedList regular.add(int,E)
. E seaddAll
funciona como pretendido, depende de detalhes de implementação não especificados. É por isso que você deve preferir delegação sobre a herança ...Use composição not extends (sim, quero dizer extends, como em uma referência à palavra-chave extends em java e sim, isso é herança). A composição é mais alta porque protege completamente sua implementação, permitindo alterar a implementação sem afetar os usuários de sua classe.
Eu recomendo tentar algo assim (estou digitando diretamente nesta janela, portanto, o comprador deve ficar atento aos erros de sintaxe):
Uma opção melhor (com base na resposta de Asaf) pode ser agrupar o CircularFifoBuffer do Apache Collections com uma classe genérica. Por exemplo:
fonte
LinkedList
é implementado, então. O objeto extra criado como um invólucro em torno da lista será bem menor, mesmo com "dezenas de milhões" de instâncias.A única coisa que sei que tem espaço limitado é a interface BlockingQueue (que é implementada pela classe ArrayBlockingQueue) - mas eles não removem o primeiro elemento se forem preenchidos, mas bloqueiam a operação de colocação até que o espaço esteja livre (removido por outro encadeamento )
Que eu saiba, sua implementação trivial é a maneira mais fácil de obter esse comportamento.
fonte
BlockingQueue
não é uma resposta. Já pensei em outras bibliotecas comuns, como o Apache Commons, as bibliotecas do Eclipse, as da Spring, as adições do Google, etc.?Você pode usar um MinMaxPriorityQueue do Google Guava , no javadoc:
fonte
Map
comportar como umList
. Mas ambas as idéias mostram uma incompreensão completa de algoritmos e design de software.MinMaxPriorityQueue
no que o OP deseja é mais trivial do que modificar umLinkedList
(o código do OP nem chega perto).long
como um tipo de cursor dentro da minha própria sugestão, dizendo que seria suficientemente amplo na prática, embora teoricamente você possa adicionar mais de 2 ^ 64 objetos a essa fila, momento em que a solução quebraria. .Um LRUMap é outra possibilidade, também do Apache Commons.
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/LRUMap.html
fonte
fonte