Java PriorityQueue

In questo tutorial, impareremo a conoscere la classe PriorityQueue del framework delle collezioni Java con l'aiuto di esempi.

La PriorityQueueclasse fornisce la funzionalità della struttura dati dell'heap.

Implementa l'interfaccia Queue.

A differenza delle code normali, gli elementi della coda con priorità vengono recuperati in ordine ordinato.

Supponiamo di voler recuperare gli elementi in ordine crescente. In questo caso, il capo della coda di priorità sarà l'elemento più piccolo. Una volta che questo elemento è stato recuperato, il successivo elemento più piccolo sarà il capo della coda.

È importante notare che gli elementi di una coda di priorità potrebbero non essere ordinati. Tuttavia, gli elementi vengono sempre recuperati in ordine ordinato.

Creazione di PriorityQueue

Per creare una coda prioritaria, dobbiamo importare il java.util.PriorityQueuepacchetto. Una volta importato il pacchetto, ecco come possiamo creare una coda di priorità in Java.

 PriorityQueue numbers = new PriorityQueue(); 

Qui abbiamo creato una coda di priorità senza argomenti. In questo caso, il capo della coda di priorità è l'elemento più piccolo della coda. E gli elementi vengono rimossi in ordine crescente dalla coda.

Tuttavia, possiamo personalizzare l'ordine degli elementi con l'aiuto Comparatordell'interfaccia. Lo impareremo più avanti in questo tutorial.

Metodi di PriorityQueue

La PriorityQueueclasse fornisce l'implementazione di tutti i metodi presenti Queuenell'interfaccia.

Inserisci elementi in PriorityQueue

  • add()- Inserisce l'elemento specificato nella coda. Se la coda è piena, genera un'eccezione.
  • offer()- Inserisce l'elemento specificato nella coda. Se la coda è piena, ritorna false.

Per esempio,

 import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); // Using the add() method numbers.add(4); numbers.add(2); System.out.println("PriorityQueue: " + numbers); // Using the offer() method numbers.offer(1); System.out.println("Updated PriorityQueue: " + numbers); ) ) 

Produzione

 PriorityQueue: (2, 4) PriorityQueue aggiornata: (1, 4, 2) 

Qui abbiamo creato una coda prioritaria denominata numeri. Abbiamo inserito 4 e 2 in coda.

Sebbene 4 sia inserito prima di 2, l'intestazione della coda è 2. È perché l'intestazione della coda prioritaria è l'elemento più piccolo della coda.

Abbiamo quindi inserito 1 in coda. La coda è ora riorganizzata per memorizzare l'elemento più piccolo 1 in testa alla coda.

Accesso agli elementi PriorityQueue

Per accedere agli elementi da una coda prioritaria, possiamo utilizzare il peek()metodo. Questo metodo restituisce l'inizio della coda. Per esempio,

 import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.println("PriorityQueue: " + numbers); // Using the peek() method int number = numbers.peek(); System.out.println("Accessed Element: " + number); ) ) 

Produzione

 PriorityQueue: (1, 4, 2) Elemento a cui si accede: 1 

Rimuovi elementi PriorityQueue

  • remove() - rimuove l'elemento specificato dalla coda
  • poll() - restituisce e rimuove la testa della coda

Per esempio,

 import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.println("PriorityQueue: " + numbers); // Using the remove() method boolean result = numbers.remove(2); System.out.println("Is the element 2 removed? " + result); // Using the poll() method int number = numbers.poll(); System.out.println("Removed Element Using poll(): " + number); ) ) 

Produzione

PriorityQueue: (1, 4, 2) L'elemento 2 è stato rimosso? true Elemento rimosso utilizzando poll (): 1

Iterazione su una PriorityQueue

Per iterare sugli elementi di una coda di priorità, possiamo usare il iterator()metodo. Per utilizzare questo metodo, dobbiamo importare il java.util.Iteratorpacchetto. Per esempio,

 import java.util.PriorityQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.print("PriorityQueue using iterator(): "); //Using the iterator() method Iterator iterate = numbers.iterator(); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Produzione

 PriorityQueue utilizzando l'iteratore (): 1, 4, 2, 

Altri metodi PriorityQueue

Metodi Descrizioni
contains(element) Cerca nella coda di priorità l'elemento specificato. Se l'elemento viene trovato, ritorna true, altrimenti ritorna false.
size() Restituisce la lunghezza della coda di priorità.
toArray() Converte una coda con priorità in un array e lo restituisce.

PriorityQueue Comparator

In tutti gli esempi precedenti, gli elementi della coda di priorità vengono recuperati in ordine naturale (ordine crescente). Tuttavia, possiamo personalizzare questo ordine.

Per questo, dobbiamo creare la nostra classe di confronto che implementa l' Comparatorinterfaccia. Per esempio,

 import java.util.PriorityQueue; import java.util.Comparator; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(new CustomComparator()); numbers.add(4); numbers.add(2); numbers.add(1); numbers.add(3); System.out.print("PriorityQueue: " + numbers); ) ) class CustomComparator implements Comparator ( @Override public int compare(Integer number1, Integer number2) ( int value = number1.compareTo(number2); // elements are sorted in reverse order if (value> 0) ( return -1; ) else if (value < 0) ( return 1; ) else ( return 0; ) ) ) 

Produzione

 PriorityQueue: (4, 3, 1, 2) 

Nell'esempio precedente, abbiamo creato una coda di priorità che passa la classe CustomComparator come argomento.

La classe CustomComparator implementa l' Comparatorinterfaccia.

Quindi sovrascriviamo il compare()metodo. Il metodo ora fa sì che la testa dell'elemento sia il numero più grande.

Per saperne di più sul comparatore, visita Java Comparator.

Articoli interessanti...