PriorityQueue en Java

PriorityQueue se usa cuando se supone que los objetos se procesarán en función de la prioridad. Se sabe que una Cola sigue el algoritmo First-In-First-Out, pero a veces se necesita procesar los elementos de la cola de acuerdo con la prioridad, ahí es cuando entra en juego PriorityQueue.

PriorityQueue se basa en el montón de prioridad. Los elementos de la cola de prioridad se ordenan según el ordenamiento natural o mediante un comparador proporcionado en el momento de la construcción de la cola, según el constructor que se utilice.  

Queue-Deque-PriorityQueue-In-Java

En la cola de prioridad a continuación, un elemento con un valor ASCII máximo tendrá la prioridad más alta.

Working of PriorityQueue

Declaración:

public class PriorityQueue<E> extends AbstractQueue<E> implements Serializable

where E is the type of elements held in this queue

La clase implementa las interfaces Serializable , Iterable<E> , Collection<E> , Queue<E> .

Algunos puntos importantes en Priority Queue son los siguientes: 

  • PriorityQueue no permite valores nulos.
  • No podemos crear una PriorityQueue de objetos que no son comparables
  • PriorityQueue son colas independientes.
  • La cabeza de esta cola es el elemento menor con respecto al orden especificado. Si varios elementos están empatados por el valor mínimo, la cabeza es uno de esos elementos: los empates se rompen arbitrariamente.
  • Dado que PriorityQueue no es seguro para subprocesos, Java proporciona la clase PriorityBlockingQueue que implementa la interfaz BlockingQueue para usar en un entorno de subprocesos múltiples de Java.
  • Las operaciones de recuperación de la cola sondean, eliminan, observan y el elemento accede al elemento que se encuentra al principio de la cola.
  • Proporciona tiempo O(log(n)) para los métodos de adición y sondeo.
  • Hereda métodos de AbstractQueue , AbstractCollection , Collection y Object class.

Constructores:

1. PriorityQueue(): crea una PriorityQueue con la capacidad inicial predeterminada (11) que ordena sus elementos según su orden natural.

PriorityQueue<E> pq = new PriorityQueue<E>();

2. PriorityQueue(Collection<E> c): crea una PriorityQueue que contiene los elementos de la colección especificada.

PriorityQueue<E> pq = new PriorityQueue<E>(Colección<E> c);

3. PriorityQueue(int initialCapacity) : crea una PriorityQueue con la capacidad inicial especificada que ordena sus elementos según su ordenación natural.

PriorityQueue<E> pq = new PriorityQueue<E>(int initialCapacity);

4. PriorityQueue(int initialCapacity, Comparator<E> comparador): Crea un PriorityQueue con la capacidad inicial especificada que ordena sus elementos de acuerdo con el comparador especificado.

PriorityQueue<E> pq = new PriorityQueue(int initialCapacity, Comparator<E> comparador);

5. PriorityQueue(PriorityQueue<E> c) : Crea una PriorityQueue que contiene los elementos en la cola de prioridad especificada.

PriorityQueue<E> pq = new PriorityQueue(PriorityQueue<E> c);

6. PriorityQueue(SortedSet<E> c) : crea una PriorityQueue que contiene los elementos del conjunto ordenado especificado.

PriorityQueue<E> pq = new PriorityQueue<E>(SortedSet<E> c);

Ejemplo:

El siguiente ejemplo explica las siguientes operaciones básicas de la cola de prioridad.

  • boolean add (elemento E): este método inserta el elemento especificado en esta cola de prioridad.
  • ojeada pública(): este método recupera, pero no elimina, el encabezado de esta cola o devuelve un valor nulo si esta cola está vacía.
  • encuesta pública(): este método recupera y elimina el encabezado de esta cola, o devuelve un valor nulo si esta cola está vacía.

Java

// Java program to demonstrate the
// working of PriorityQueue
import java.util.*;
  
class PriorityQueueDemo {
    
      // Main Method
    public static void main(String args[])
    {
        // Creating empty priority queue
        PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>();
  
        // Adding items to the pQueue using add()
        pQueue.add(10);
        pQueue.add(20);
        pQueue.add(15);
  
        // Printing the top element of PriorityQueue
        System.out.println(pQueue.peek());
  
        // Printing the top element and removing it
        // from the PriorityQueue container
        System.out.println(pQueue.poll());
  
        // Printing the top element again
        System.out.println(pQueue.peek());
    }
}
Producción

10
10
15

Operaciones en PriorityQueue

Veamos cómo realizar algunas operaciones de uso frecuente en la clase Priority Queue.

1. Agregar elementos: para agregar un elemento en una cola de prioridad, podemos usar el método add() . El pedido de inserción no se conserva en PriorityQueue. Los elementos se almacenan según el orden de prioridad que es ascendente por defecto. 

Java

/*package whatever //do not write package name here */
  
import java.util.*;
import java.io.*;
    
public class PriorityQueueDemo {
    
    public static void main(String args[])
    {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for(int i=0;i<3;i++){
            pq.add(i);
            pq.add(1);
        }
        System.out.println(pq);
    }
}
Producción

[0, 1, 1, 1, 2, 1]

No obtendremos elementos ordenados imprimiendo PriorityQueue.

java-collection-framework-fundamentals-self-paced

Java

/*package whatever //do not write package name here */
  
import java.util.*;
import java.io.*;
    
public class PriorityQueueDemo {
    
    public static void main(String args[])
    {
        PriorityQueue<String> pq = new PriorityQueue<>();
    
        pq.add("Geeks");
        pq.add("For");
        pq.add("Geeks");
    
        System.out.println(pq);
    }
}
Producción

[For, Geeks, Geeks]

2. Eliminación de elementos: para eliminar un elemento de una cola de prioridad, podemos usar el método remove() . Si hay varios de estos objetos, se elimina la primera aparición del objeto. Aparte de eso, el método poll() también se usa para quitar la cabeza y devolverla.

Java

// Java program to remove elements
// from a PriorityQueue
  
import java.util.*;
import java.io.*;
  
public class PriorityQueueDemo {
  
    public static void main(String args[])
    {
        PriorityQueue<String> pq = new PriorityQueue<>();
  
        pq.add("Geeks");
        pq.add("For");
        pq.add("Geeks");
  
        System.out.println("Initial PriorityQueue " + pq);
  
          // using the method
        pq.remove("Geeks");
  
        System.out.println("After Remove - " + pq);
  
        System.out.println("Poll Method - " + pq.poll());
  
        System.out.println("Final PriorityQueue - " + pq);
    }
}
Producción

Initial PriorityQueue [For, Geeks, Geeks]
After Remove - [For, Geeks]
Poll Method - For
Final PriorityQueue - [Geeks]

3. Acceder a los elementos: Dado que Queue sigue el principio First In First Out, solo podemos acceder a la cabeza de la cola. Para acceder a los elementos de una cola de prioridad, podemos usar el método peek().
 

Java

// Java program to access elements
// from a PriorityQueue
import java.util.*;
  
class PriorityQueueDemo {
    
      // Main Method
    public static void main(String[] args)
    {
  
        // Creating a priority queue
        PriorityQueue<String> pq = new PriorityQueue<>();
        pq.add("Geeks");
        pq.add("For");
        pq.add("Geeks");
        System.out.println("PriorityQueue: " + pq);
  
        // Using the peek() method
        String element = pq.peek();
        System.out.println("Accessed Element: " + element);
    }
}
Producción

PriorityQueue: [For, Geeks, Geeks]
Accessed Element: For

4. Iteración de PriorityQueue: hay varias formas de iterar a través de PriorityQueue. La forma más famosa es convertir la cola en una array y atravesarla usando el bucle for. Sin embargo, la cola también tiene un iterador incorporado que se puede usar para iterar a través de la cola.

Java

// Java program to iterate elements
// to a PriorityQueue
  
import java.util.*;
  
public class PriorityQueueDemo {
  
      // Main Method
    public static void main(String args[])
    {
        PriorityQueue<String> pq = new PriorityQueue<>();
  
        pq.add("Geeks");
        pq.add("For");
        pq.add("Geeks");
  
        Iterator iterator = pq.iterator();
  
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
    }
}
Producción

For Geeks Geeks 

Métodos en la clase PriorityQueue

MÉTODO DESCRIPCIÓN
añadir (E mi) Inserta el elemento especificado en esta cola de prioridad.
clear() Elimina todos los elementos de esta cola de prioridad.
comparador() Devuelve el comparador utilizado para ordenar los elementos de esta cola, o nulo si esta cola se ordena según el orden natural de sus elementos.
contiene​(Objeto o) Devuelve verdadero si esta cola contiene el elemento especificado.
forEach​(Consumidor<? super E> acción) Realiza la acción dada para cada elemento del iterable hasta que se hayan procesado todos los elementos o la acción genere una excepción.
iterador() Devuelve un iterador sobre los elementos de esta cola.
 oferta​(E e) Inserta el elemento especificado en esta cola de prioridad.
eliminar​(Objeto o) Elimina una sola instancia del elemento especificado de esta cola, si está presente.
removeAll​(Colección<?> c) Elimina todos los elementos de esta colección que también están contenidos en la colección especificada (operación opcional).
removeIf​(predicado<? filtro super E>) Elimina todos los elementos de esta colección que satisfacen el predicado dado.
retenerTodo​(Colección<?> c) Retiene solo los elementos de esta colección que están contenidos en la colección especificada (operación opcional).
divisor() Crea un Spliterator de enlace tardío y rápido sobre los elementos de esta cola.
 aArray() Devuelve una array que contiene todos los elementos de esta cola.
 a la Array​(T[] a) Devuelve una array que contiene todos los elementos de esta cola; el tipo de tiempo de ejecución de la array devuelta es el de la array especificada.

Métodos declarados en la clase java.util.AbstractQueue

MÉTODO DESCRIPCIÓN
addAll(Colección<? extiende E> c) Agrega todos los elementos de la colección especificada a esta cola.
elemento() Recupera, pero no elimina, el encabezado de esta cola.
retirar() Recupera y elimina el encabezado de esta cola.

Métodos declarados en la clase java.util.AbstractCollection

MÉTODO DESCRIPCIÓN
contieneTodo(Colección<?> c) Devuelve verdadero si esta colección contiene todos los elementos de la colección especificada.
esta vacio() Devuelve verdadero si esta colección no contiene elementos.
Enstringr() Devuelve una representación de string de esta colección.

Métodos declarados en la interfaz java.util.Collection

MÉTODO DESCRIPCIÓN
contieneTodo(Colección<?> c) Devuelve verdadero si esta colección contiene todos los elementos de la colección especificada.
es igual a (Objeto o) Compara el objeto especificado con esta colección para la igualdad.
código hash() Devuelve el valor del código hash para esta colección.
esta vacio() Devuelve verdadero si esta colección no contiene elementos.
flujoParalelo() Devuelve un Stream posiblemente paralelo con esta colección como fuente.
Talla() Devuelve el número de elementos de esta colección.
corriente() Devuelve un Stream secuencial con esta colección como fuente.
toArray(IntFunction<T[]> generador) Devuelve una array que contiene todos los elementos de esta colección, utilizando la función de generador proporcionada para asignar la array devuelta.

Métodos declarados en la interfaz java.util.Queue

MÉTODO DESCRIPCIÓN
ojeada() Recupera, pero no elimina, el encabezado de esta cola o devuelve un valor nulo si esta cola está vacía.
encuesta() Recupera y elimina el encabezado de esta cola, o devuelve un valor nulo si esta cola está vacía.

Aplicaciones

Artículos relacionados

Este artículo es una contribución de Mehak Kumar. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *