English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Control de flujo de Java

Java Arreglo

Java Programación Orientada a Objetos (I)

Java Programación Orientada a Objetos (II)

Java Programación Orientada a Objetos (III)

Manejo de excepciones en Java

Java Lista (List)

Java Cola (Queue)

Java Colección Map (Map)

Java Conjunto (Set)

Java Entrada/Salida (I/O)

Lector de Java/Writer

Temas de Java

PriorityQueue de Java

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.

Crear PriorityQueue

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.

Métodos de PriorityQueue

La clase PriorityQueue proporciona todas las implementaciones de los métodos que existen en la interfaz Queue.

Insertar el elemento en PriorityQueue

  • 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.

Acceder a elementos de PriorityQueue

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

Eliminar elementos de PriorityQueue

  • 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

Recorrer PriorityQueue

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,

Otras métodos de PriorityQueue

MétodoDescripció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.

Comparador de cola de prioridad (comparator)

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.