Guia para Apache Commons CircularFifoQueue
1. Visão geral
Neste tutorial rápido, daremos uma olhada na estrutura de dadosCircularFifoQueue fornecida no pacotecollections4.queue da biblioteca de coleções do Apache Commons.
CircularFifoQueue<E> implementa a interfaceQueue<E> e é umfixed-size,non-blocking queue -when you add an element to a queue that is full, the oldest element is removed to make room for the new element.
2. Dependência do Maven
Para projetos Maven, precisamos adicionar a dependência necessária:
org.apache.commons
commons-collections4
4.1
Você pode encontrar a versão mais recente desta biblioteca emMaven Central.
3. Construtores
Para criar um objetoCircularFifoQueue, podemos usar o construtor padrão, que cria uma fila com o tamanho padrão de 32:
CircularFifoQueue bits = new CircularFifoQueue();
Se soubermos o tamanho máximo desejado de nossa fila, podemos usar o construtor que recebeint como argumento para especificar o tamanho:
CircularFifoQueue colors = new CircularFifoQueue<>(5);
Também existe a opção de criar um objetoCircularFifoQueue fornecendo ao construtor uma coleção como argumento.
Nesse caso, a fila será preenchida com os elementos da coleção e seu tamanho será o mesmo que o tamanho da coleção:
CircularFifoQueue daysOfWeek = new CircularFifoQueue<>(days);
Nota: como essa fila já está cheia quando construída, qualquer adição fará com que o primeiro elemento criado seja descartado.
4. Adicionando elementos
Como em qualquer implementação deQueue, podemos adicionar elementos usando os métodosaddeoffer. OQueue JavaDoc especifica que o métodooffer deve ser usado ao operar com uma fila com restrição de capacidade.
No entanto, comoCircularFifoQueue não é bloqueador, as inserções não podem falhar. Como resultado, seus métodosaddeoffer exibem o mesmo comportamento.
Vamos ver como podemos adicionar elementos à nossa filacolors usando o métodoadd:
colors.add("Red");
colors.add("Blue");
colors.add("Green");
E vamos adicionar alguns elementos usando o métodooffer:
colors.offer("White");
colors.offer("Black");
5. Removendo e Recuperando Elementos
A classeCircularFifoQueue nos oferece alguns métodos que podem ser úteis quando precisamos manipular os elementos da fila. Alguns métodos são usados para obter elementos da fila, outros para remover elementos e outros para realizar as duas operações ao mesmo tempo.
5.1. MétodoPeek
O métodopeek não é destrutivo ereturns the head of the queue.
Este método sempre retornará o mesmo elemento, desde que não haja nenhuma alteração nos elementos na fila entre as chamadas. If the queue is empty, peek will return null:
String colorsHead = colors.peek();
5.2. MétodoElement
O métodoelement é semelhante apeek - itreturns the current head of the queue.
No entanto, o métodoelement lança uma exceção se a fila estiver vazia:
colorsHead = colors.element();
5.3. MétodoGet
Quando precisamos obter um determinado elemento da fila, podemos usar o métodoget. Este método usa o índice do elemento desejado como argumento. O índice da fila é baseado em zero.
Vamos pegar um elemento da filacolors que preenchemos com elementos anteriormente:
String color = colors.get(1);
Isso retornará “Blue“.
Agora vamos adicionar três elementos à nossa fila e verificar este resultado novamente:
colors.add("Orange");
colors.add("Violet");
colors.add("Pink");
color = colors.get(1);
Desta vez, o métodoget retorna “Black“. Isso ocorre porque nossa fila foi criada com um tamanho limitado de cinco, e os três primeiros elementos (“Red“, “Blue“, “Green“) foram removidos com a adição de os novos.
5.4. MétodoPoll
O métodopollremoves the head element of the queue and returns that element. Se a fila não tiver elementos, o métodopoll retornanull:
colorsHead = colors.poll();
5.5. MétodoRemove
The remove methodoperates much like the poll method - retorna o topo da fila e remove o elemento retornado. No entanto, if the queue is empty, remove will throw an exception:
colorsHead = colors.remove();
5.6. MétodoClear
Podemos usar o métodoclear quando quisermos esvaziar nossa fila:
colors.clear();
6. Métodos de verificação
Depois de ver como podemos adicionar, remover e recuperar elementos da fila, vamos ver o que a classe tem a oferecer em relação à verificação de seu tamanho e capacidade. Usaremos as filas criadas nas seções anteriores em nossos exemplos.
Em geral, temos à disposição dois métodos para verificar o tamanho da nossa fila - um para obter o tamanho máximo do objeto e outro para verificar a contagem atual de elementos.
O métodomaxSize retornará um valorinteger do tamanho máximo da fila:
int maxSize = bits.maxSize();
Isso retornará32, pois a filabits foi criada com o construtor padrão.
O métodosize retornará o número de elementos atualmente armazenados na fila:
int size = colors.size();
Para verificar a capacidade do objeto de fila, podemos usar os métodosisEmptyeisAtFullCapacity.
O métodoisEmpty retornará um valorboolean que indica se a fila está vazia ou não:
boolean isEmpty = bits.isEmpty();
Para verificar se nossa fila está cheia, podemos usarthe isAtFullCapacity method. Este métodoreturns true only if the maximum size of elements in the queue has been reached:
boolean isFull = daysOfWeek.isAtFullCapacity();
Você deve observar que este método éavailable as of version 4.1.
Outro método da interfaceQueue que podemos usar para verificar se nossa fila está cheia é o métodoisFull. ParaCircularFifoQueue,the isFull method will always return false, because the queue can always accept new elements:
boolean isFull = daysOfWeek.isFull();
7. Conclusão
Neste artigo, vimos como usar o Apache CommonsCircularFifoQueue. Vimos alguns exemplos que ilustram como instanciar um objeto de fila, como preenchê-lo, como esvaziá-lo, como obter e remover elementos dele e como verificar seu tamanho e capacidade.
Você pode encontrar o código de exemplo completo usado neste artigo em nossoGitHub project. Como é um projeto do Maven, você deve poder importá-lo e executá-lo como está.