Java PriorityQueue: Fundamentos, Operaciones y Ordenación Personalizada
Java PriorityQueue
Explora la clase PriorityQueue en el framework de colecciones de Java a través de ejemplos claros y guía de mejores prácticas.
La clase PriorityQueue implementa la estructura de datos heap y satisface la interfaz Queue, ofreciendo recuperación eficiente de elementos basada en prioridad en lugar de orden de inserción.

A diferencia de las colas estándar, los elementos se devuelven en orden ordenado. Si necesitas orden ascendente, la cabeza de la cola es el elemento más pequeño; cada eliminación posterior produce el siguiente valor más pequeño. Ten en cuenta que el orden interno no está garantizado—solo el orden de extracción está ordenado.
Creando una PriorityQueue
Comienza importando java.util.PriorityQueue:
import java.util.PriorityQueue;
PriorityQueue<Integer> numeros = new PriorityQueue<>();
Esta configuración por defecto usa orden natural (ascendente). Puedes personalizar el orden suministrando un Comparator al construir la cola.
Métodos Clave de PriorityQueue
Todos los métodos definidos en la interfaz Queue están disponibles, más algunas operaciones específicas de cola.
Insertando Elementos
add()– Añade un elemento; lanza excepción si la cola está llena.offer()– Añade un elemento; devuelvefalsesi la cola está llena.
Ejemplo:
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 Actualizada: " + numeros);
}
}
Salida
PriorityQueue: [2, 4] PriorityQueue Actualizada: [1, 4, 2]
Aunque 4 se añadió antes que 2, la cabeza sigue siendo 2 porque es el elemento más pequeño. Al añadir 1, se reordena la cola para que 1 sea la cabeza.
Accediendo a Elementos
Usa peek() para ver la cabeza sin eliminarla:
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 Accedido: " + numero);
}
}
Salida
PriorityQueue: [1, 4, 2] Elemento Accedido: 1
Eliminando Elementos
remove()– Elimina un elemento especificado, devolviendotruesi tuvo éxito.poll()– Recupera y elimina la cabeza de la cola.
Ejemplo:
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("¿Se eliminó el elemento 2? " + resultado);
int numero = numeros.poll();
System.out.println("Elemento Eliminado con poll(): " + numero);
}
}
Salida
PriorityQueue: [1, 4, 2] ¿Se eliminó el elemento 2? true Elemento Eliminado con poll(): 1
Iterando sobre una PriorityQueue
Itera con iterator() (requiere 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(", ");
}
}
}
Salida
PriorityQueue usando iterator(): 1, 4, 2,
Métodos Adicionales
| Método | Descripción |
|---|---|
contains(elemento) | Devuelve true si el elemento existe en la cola. |
size() | Devuelve el número de elementos en la cola. |
toArray() | Convierte la cola a un array. |
Ordenación Personalizada con Comparator
Para invertir el orden natural o implementar cualquier prioridad personalizada, suministra un Comparator al crear la cola:
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); // orden inverso
}
}
Salida
PriorityQueue: [4, 3, 1, 2]
El comparador personalizado asegura que la cabeza sea el elemento más grande. Para más detalles, consulta la API Java Comparator.
Java
- Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
- Comentarios en Java: Tipos, Uso y Mejores Prácticas
- Dominar if…else en Java: Control de Flujo Explicado
- Dominar el Bucle for Mejorado en Java: Sintaxis, Ejemplos y Mejores Prácticas
- Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
- Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
- Aserciones en Java: Guía práctica para detectar bugs y asegurar fiabilidad del código
- Entendiendo Java Vector: Uso, Características y Comparación con ArrayList