Java PriorityQueue: Fundamentos, Operações e Ordenação Personalizada
Java PriorityQueue
Explore a classe PriorityQueue no framework de coleções do Java através de exemplos claros e orientações de melhores práticas.
A classe PriorityQueue implementa a estrutura de dados heap e satisfaz a interface Queue, oferecendo recuperação eficiente de elementos baseada em prioridade, não em ordem de inserção.
Diferente de filas padrão, os elementos são retornados em ordem classificada. Se você precisar de ordem crescente, o cabeça da fila é o menor elemento; cada remoção subsequente produz o próximo menor valor. Note que a ordenação interna não é garantida — apenas a ordem de extração é classificada.
Criando uma PriorityQueue
Comece importando java.util.PriorityQueue:
import java.util.PriorityQueue;
PriorityQueue<Integer> numeros = new PriorityQueue<>();
Esta configuração padrão usa ordem natural (crescente). Você pode personalizar a ordem fornecendo um Comparator ao construir a fila.
Principais Métodos da PriorityQueue
Todos os métodos definidos na interface Queue estão disponíveis, além de algumas operações específicas de fila.
Inserindo Elementos
add()– Adiciona um elemento; lança exceção se a fila estiver cheia.offer()– Adiciona um elemento; retornafalsese a fila estiver cheia.
Exemplo:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numeros = new PriorityQueue<>();
numeros.add(4);
numeros.add(2);
System.out.println("PriorityQueue: " + numeros);
numeros.offer(1);
System.out.println("PriorityQueue Atualizada: " + numeros);
}
}
Saída
PriorityQueue: [2, 4] PriorityQueue Atualizada: [1, 4, 2]
Embora 4 tenha sido adicionado antes de 2, o cabeça permanece 2 porque é o menor elemento. Adicionar 1 reordena a fila para que 1 se torne o cabeça.
Acessando Elementos
Use peek() para visualizar o cabeça sem removê-lo:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numeros = new PriorityQueue<>();
numeros.add(4);
numeros.add(2);
numeros.add(1);
System.out.println("PriorityQueue: " + numeros);
int numero = numeros.peek();
System.out.println("Elemento Acessado: " + numero);
}
}
Saída
PriorityQueue: [1, 4, 2] Elemento Acessado: 1
Removendo Elementos
remove()– Remove um elemento especificado, retornandotruese bem-sucedido.poll()– Recupera e remove o cabeça da fila.
Exemplo:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numeros = new PriorityQueue<>();
numeros.add(4);
numeros.add(2);
numeros.add(1);
System.out.println("PriorityQueue: " + numeros);
boolean resultado = numeros.remove(2);
System.out.println("O elemento 2 foi removido? " + resultado);
int numero = numeros.poll();
System.out.println("Elemento Removido com poll(): " + numero);
}
}
Saída
PriorityQueue: [1, 4, 2] O elemento 2 foi removido? true Elemento Removido com poll(): 1
Iterando sobre uma PriorityQueue
Itere com iterator() (requer java.util.Iterator):
import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numeros = new PriorityQueue<>();
numeros.add(4);
numeros.add(2);
numeros.add(1);
System.out.print("PriorityQueue usando iterator(): ");
Iterator<Integer> iterar = numeros.iterator();
while (iterar.hasNext()) {
System.out.print(iterar.next());
System.out.print(", ");
}
}
}
Saída
PriorityQueue usando iterator(): 1, 4, 2,
Métodos Adicionais
| Método | Descrição |
|---|---|
contains(elemento) | Retorna true se o elemento existe na fila. |
size() | Retorna o número de elementos na fila. |
toArray() | Converte a fila para um array. |
Ordenação Personalizada com Comparator
Para inverter a ordem natural ou implementar qualquer prioridade personalizada, forneça um Comparator ao criar a fila:
import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numeros = new PriorityQueue<>(new ComparadorPersonalizado());
numeros.add(4);
numeros.add(2);
numeros.add(1);
numeros.add(3);
System.out.print("PriorityQueue: " + numeros);
}
}
class ComparadorPersonalizado implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return b.compareTo(a); // ordem reversa
}
}
Saída
PriorityQueue: [4, 3, 1, 2]
O comparador personalizado garante que o cabeça seja o maior elemento. Para insights mais profundos, consulte a API Java Comparator.
Java
- Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
- Comentários em Java: Tipos, Uso e Boas Práticas
- Dominando o Loop for Aprimorado em Java: Sintaxe, Exemplos e Boas Práticas
- Dominando Strings em Java: Criação, Métodos e Boas Práticas
- Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
- Asserções em Java: Guia Prático para Detectar Bugs e Garantir Confiabilidade do Código
- Entendendo o Java Vector: Uso, Recursos e Comparação com ArrayList