Métodos
Filas prioritárias
Uma PriorityQueue
(Fila Prioritária) é usada quando os objetos devem ser processados com base na prioridade. Nesse caso, queremos ordenar a fila pelo tempo que o cliente está esperando. Sabe-se que uma Fila segue o algoritmo First-In-First-Out, mas às vezes é necessário que os elementos da fila sejam processados de acordo com a prioridade; é aí que PriorityQueue
entra em ação. O PriorityQueue é baseado no amontoado de prioridade. Os elementos da fila de prioridade são ordenados de acordo com a ordenação natural, ou por um Comparador fornecido no momento da construção da fila, dependendo de qual construtor é utilizado.
Antes de criarmos uma fila, teremos que importar
a classe PriorityQueue
. Para facilitar a vida, podemos usar um *
para importar todas as classes da biblioteca. Vai parecer algo assim.
// Importará PriorityQueue, entre outras classes
import java.util.*;
Existem vários métodos para usar em uma fila prioritária e se você estiver interessado, sinta-se à vontade para pesquisar os métodos. Porém, agora falaremos apenas sobre os métodos mais importantes: add()
, peek()
e poll()
.
Criando uma fila prioritária
Queue<Integer> orders = new PriorityQueue<>();
Existem diversas maneiras de ordenar a fila de prioridade e cabe a você decidir como deseja implementá-la.
Adicionando Elementos
Você pode adicionar a uma fila usando o método add()
. O PriorityQueue` classificará automaticamente os elementos para você. O padrão é a ordem natural de um objeto, mas você pode alterá-lo com base no que desejar.
add(1);
add(2);
add(3);
// Cria uma fila com elementos [1, 2, 3]
Acessando Elementos
peek()
retornará o elemento superior sem removê-lo.
queue.peek();
// Retorna 1
// A fila contém [1, 2, 3]
Removendo Elementos
poll()
retornará o elemento superior e o removerá da fila.
queue.poll();
// Retorna 1
// A fila contém [2, 3]
Com esses três métodos em mente, vamos dar uma olhada em um exemplo.
import java.util.*;
class PriorityQueueDemo {
// Método Principal
public static void main(String args[]) {
// Criando fila de prioridade vazia
PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>();
// Adicionando itens ao pQueue usando add()
pQueue.add(60);
pQueue.add(30);
pQueue.add(10);
// Imprimindo o elemento superior de PriorityQueue
System.out.println(pQueue.peek());
// Imprimindo o elemento superior e removendo-o
// do contêiner PriorityQueue
System.out.println(pQueue.poll());
// Imprimindo o elemento superior novamente
System.out.println(pQueue.peek());
}
}
Portanto, temos três clientes com tempos de espera variados de 10
, 30
e 60
. O que você acha que o compilador produzirá?
Vamos em frente e tentar digerir um pouco o código. Para a primeira linha, chamamos pQueue.peek()
. O que peek()
faz? Peek simplesmente retorna o elemento no topo. O que está no topo? Bem, como já está classificado, deve imprimir o menor elemento que é 10
.
Que tal pQueue.poll()
? Bem, ele deveria fazer exatamente a mesma coisa que o peek anterior, mas agora remove o elemento superior da fila que é 10
.
E se tentarmos chamar peek()
novamente? Bem, agora que 10
não existe mais, agora será 30
.
Portanto, o resultado final pode ser assim:
10
10
30
Espere aí! Não queríamos que as pessoas que esperavam mais tempo na fila chegassem primeiro ao topo da fila? Parece que a fila produz os elementos menores primeiro, mas o que realmente queremos é o elemento maior. Para conseguir isso, teríamos apenas que instanciar a fila de maneira um pouco diferente. Collections.reverseOrder()
basicamente reverterá a ordem da nossa fila. Assim!
PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>(Collections.reverseOrder());
Agora nossa implementação deve ser sólida.
import java.util.*;
class PriorityQueueDemo {
// Método Principal
public static void main(String args[]) {
// Criando fila de prioridade vazia
PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>(Collections.reverseOrder());
// Adicionando itens ao pQueue usando add()
pQueue.add(60);
pQueue.add(30);
pQueue.add(10);
// Imprimindo o elemento superior de PriorityQueue
System.out.println(pQueue.peek());
// Imprimindo o elemento superior e removendo-o
// do contêiner PriorityQueue
System.out.println(pQueue.poll());
// Imprimindo o elemento superior novamente
System.out.println(pQueue.peek());
}
}
Pergunta de checagem: Qual será a saída deste pQueue
agora?
Answer:
60
60
30