Neste tutorial, aprenderemos sobre a classe PriorityQueue da estrutura de coleções Java com a ajuda de exemplos.
A PriorityQueue
classe fornece a funcionalidade da estrutura de dados do heap.
Ele implementa a interface Queue.
Ao contrário das filas normais, os elementos da fila de prioridade são recuperados em ordem classificada.
Suponha que desejamos recuperar os elementos em ordem crescente. Nesse caso, o chefe da fila de prioridade será o menor elemento. Depois que esse elemento for recuperado, o próximo menor elemento será o primeiro da fila.
É importante observar que os elementos de uma fila de prioridade não podem ser classificados. No entanto, os elementos são sempre recuperados em ordem de classificação.
Criando PriorityQueue
Para criar uma fila prioritária, devemos importar o java.util.PriorityQueue
pacote. Depois de importar o pacote, aqui está como podemos criar uma fila de prioridade em Java.
PriorityQueue numbers = new PriorityQueue();
Aqui, criamos uma fila de prioridade sem nenhum argumento. Nesse caso, o chefe da fila de prioridade é o menor elemento da fila. E os elementos são removidos em ordem crescente da fila.
No entanto, podemos personalizar a ordem dos elementos com a ajuda da Comparator
interface. Aprenderemos sobre isso mais tarde neste tutorial.
Métodos de PriorityQueue
A PriorityQueue
classe fornece a implementação de todos os métodos presentes na Queue
interface.
Inserir elementos em PriorityQueue
add()
- Insere o elemento especificado na fila. Se a fila estiver cheia, ele lançará uma exceção.offer()
- Insere o elemento especificado na fila. Se a fila estiver cheia, ele retornafalse
.
Por exemplo,
import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); // Using the add() method numbers.add(4); numbers.add(2); System.out.println("PriorityQueue: " + numbers); // Using the offer() method numbers.offer(1); System.out.println("Updated PriorityQueue: " + numbers); ) )
Resultado
PriorityQueue: (2, 4) PriorityQueue atualizado: (1, 4, 2)
Aqui, criamos uma fila prioritária chamada números. Inserimos 4 e 2 na fila.
Embora 4 seja inserido antes de 2, o chefe da fila é 2. Isso ocorre porque o chefe da fila de prioridade é o menor elemento da fila.
Em seguida, inserimos 1 na fila. A fila agora é reorganizada para armazenar o menor elemento 1 no início da fila.
Elementos de acesso PriorityQueue
Para acessar elementos de uma fila de prioridade, podemos usar o peek()
método. Este método retorna o topo da fila. Por exemplo,
import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.println("PriorityQueue: " + numbers); // Using the peek() method int number = numbers.peek(); System.out.println("Accessed Element: " + number); ) )
Resultado
PriorityQueue: (1, 4, 2) Elemento acessado: 1
Remover elementos PriorityQueue
remove()
- remove o elemento especificado da filapoll()
- retorna e remove o topo da fila
Por exemplo,
import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.println("PriorityQueue: " + numbers); // Using the remove() method boolean result = numbers.remove(2); System.out.println("Is the element 2 removed? " + result); // Using the poll() method int number = numbers.poll(); System.out.println("Removed Element Using poll(): " + number); ) )
Resultado
PriorityQueue: (1, 4, 2) O elemento 2 foi removido? true Elemento removido usando enquete (): 1
Iterando em uma PriorityQueue
Para iterar sobre os elementos de uma fila prioritária, podemos usar o iterator()
método. Para usar este método, devemos importar o java.util.Iterator
pacote. Por exemplo,
import java.util.PriorityQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.print("PriorityQueue using iterator(): "); //Using the iterator() method Iterator iterate = numbers.iterator(); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) )
Resultado
PriorityQueue usando iterador (): 1, 4, 2,
Outros métodos PriorityQueue
Métodos | Descrições |
---|---|
contains(element) | Pesquisa a fila de prioridade para o elemento especificado. Se o elemento for encontrado, ele retorna true , caso contrário, ele retorna false . |
size() | Retorna o comprimento da fila de prioridade. |
toArray() | Converte uma fila de prioridade em uma matriz e a retorna. |
Comparador PriorityQueue
Em todos os exemplos acima, os elementos da fila de prioridade são recuperados na ordem natural (ordem crescente). No entanto, podemos personalizar esse pedido.
Para isso, precisamos criar nossa própria classe comparadora que implementa a Comparator
interface. Por exemplo,
import java.util.PriorityQueue; import java.util.Comparator; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(new CustomComparator()); numbers.add(4); numbers.add(2); numbers.add(1); numbers.add(3); System.out.print("PriorityQueue: " + numbers); ) ) class CustomComparator implements Comparator ( @Override public int compare(Integer number1, Integer number2) ( int value = number1.compareTo(number2); // elements are sorted in reverse order if (value> 0) ( return -1; ) else if (value < 0) ( return 1; ) else ( return 0; ) ) )
Resultado
PriorityQueue: (4, 3, 1, 2)
No exemplo acima, criamos uma fila de prioridade passando a classe CustomComparator como um argumento.
A classe CustomComparator implementa a Comparator
interface.
Em seguida, substituímos o compare()
método. O método agora faz com que o cabeçalho do elemento seja o maior número.
Para saber mais sobre o comparador, visite Java Comparator.