English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderemos la clase PriorityQueue del framework de colecciones de Java a través de ejemplos.
La clase PriorityQueue proporciona las funciones de estructura de datos de pila.
ImplementaInterfaz Queue.
Diferente de la cola normal, los elementos de la cola de prioridad se buscan en orden de clasificación.
Supongamos que queremos buscar elementos en orden ascendente. En este caso, la cabeza de la cola de prioridad es el elemento más pequeño. Después de buscar este elemento, el siguiente elemento más pequeño se convertirá en la cabeza de la cola.
Es necesario tener en cuenta que los elementos de la cola de prioridad pueden no estar ordenados. Sin embargo, los elementos siempre se buscan en el orden de clasificación.
Para crear una cola de prioridad, debemos importar el paquete java.util.PriorityQueue. Después de importar el paquete, podemos usar los siguientes métodos para crear una cola de prioridad en Java.
PriorityQueue<Integer> números = new PriorityQueue<>();
Aquí, creamos una cola de prioridad sin parámetros. En este caso, la cabeza de la cola de prioridad es el elemento más pequeño de la cola. Los elementos se eliminarán del cola en orden ascendente.
Pero, podemos utilizar el interfaz Comparator para personalizar el orden de los elementos. Vamos a entender esto en la parte posterior de este tutorial.
La clase PriorityQueue proporciona todas las implementaciones de los métodos que existen en la interfaz Queue.
add() - Insertar el elemento especificado en la cola. Si la cola está llena, lanzará una excepción.
offer() - Insertar el elemento especificado en la cola. Si la cola está llena, devuelve false.
Por ejemplo,
import java.util.PriorityQueue; class Main { public static void main(String[] args) { //Crear una cola de prioridad PriorityQueue<Integer> números = new PriorityQueue<>(); //Usar el método add() números.add(4); números.add(2); System.out.println("PriorityQueue: " + numbers); //Usar el método offer() numbers.offer(1); System.out.println("PriorityQueue actualizada: " + numbers); } }
Resultados de salida
PriorityQueue: [2, 4] PriorityQueue actualizada: [1, 4, 2]
Aquí, creamos una cola de prioridad llamada numbers. Hemos insertado4Y2Insertar en la cola.
Aunque4Se insertó en2Antes, pero la cabeza de la cola era2. Esto se debe a que la cabeza de la cola de prioridad es el elemento más pequeño de la cola.
Luego, vamos a1Reordenar la cola para que el elemento más pequeño1Almacenar en la cabeza de la cola.
Para acceder a un elemento en la cola de prioridad, podemos usar el método peek(). Este método devuelve la cabeza de la cola. Por ejemplo,
import java.util.PriorityQueue; class Main { public static void main(String[] args) { // Crear cola de prioridad PriorityQueue<Integer> números = new PriorityQueue<>(); números.add(4); números.add(2); números.add(1); System.out.println("PriorityQueue: " + numbers); //Usar el método peek() int number = numbers.peek(); System.out.println("Acceder al elemento: " + número); } }
Resultados de salida
PriorityQueue: [1, 4, 2] Acceder al elemento: 1
remove() - Eliminar el elemento especificado de la cola
poll() - Retornar y eliminar el elemento al principio de la cola
Por ejemplo,
import java.util.PriorityQueue; class Main { public static void main(String[] args) { // Crear una cola de prioridad PriorityQueue<Integer> números = new PriorityQueue<>(); números.add(4); números.add(2); números.add(1); System.out.println("PriorityQueue: " + numbers); //Usar el método remove() boolean result = numbers.remove(2); System.out.println("Elemento "2¿Se ha eliminado? " + result); //Usar el método poll() int number = numbers.poll(); System.out.println("Se elimina el elemento usando poll(): " + número); } }
Resultados de salida
PriorityQueue: [1, 4, 2] Elemento2¿Se ha eliminado? true Elemento eliminado usando poll(): 1
Para recorrer los elementos de la cola de prioridad, podemos usar el método iterator(). Para usar este método, debemos importar el paquete java.util.Iterator. Por ejemplo,
import java.util.PriorityQueue; import java.util.Iterator; class Main { public static void main(String[] args) { //Crear cola de prioridad PriorityQueue<Integer> números = new PriorityQueue<>(); números.add(4); números.add(2); números.add(1); System.out.print("Usar iterator() para recorrer PriorityQueue: "); //Usar el método iterator() Iterator<Integer> iterate = números.iterator(); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
Resultados de salida
Usar iterator() para recorrer PriorityQueue: 1, 4, 2,
Método | Descripción del contenido |
---|---|
contiene(elemento) | Buscar el elemento especificado en la cola de prioridad. Si se encuentra el elemento, devuelve true, de lo contrario devuelve false. |
tamaño() | Devolver la longitud de la cola de prioridad. |
toArray() | Convertir la cola de prioridad en un array y devolverla. |
En todos los ejemplos anteriores, los elementos de la cola de prioridad se recuperan en orden natural (ascendente). Pero podemos personalizar este orden.
Para esto, necesitamos crear nuestra propia clase comparator, que implementa el interfaz Comparator. Por ejemplo
import java.util.PriorityQueue; import java.util.Comparator; class Main { public static void main(String[] args) { //Crear cola de prioridad PriorityQueue<Integer> números = new PriorityQueue<>(new CustomComparator()); números.add(4); números.add(2); números.add(1); números.add(3); System.out.print("PriorityQueue: ", + numbers); } } class CustomComparator implements Comparator<Integer> { @Override public int compare(Integer number1, Integer number2) { int value = number1.compareTo(number2); //Los elementos se ordenan en orden inverso if (value > 0) { return -1; } else if (value < 0) { return 1; } else { return 0; } } }
Resultados de salida
PriorityQueue: [4, 3, 1, 2]
En el ejemplo anterior, creamos una cola de prioridad y pasamos la clase CustomComparator como parámetro.
La clase CustomComparator implementa el interfaz Comparator.
Luego, volvemos a escribir el método compare(). Ahora, este método hace que la cabeza del elemento sea el número más grande.