In questo tutorial, impareremo a conoscere la classe PriorityQueue del framework delle collezioni Java con l'aiuto di esempi.
La PriorityQueue
classe 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.PriorityQueue
pacchetto. 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 Comparator
dell'interfaccia. Lo impareremo più avanti in questo tutorial.
Metodi di PriorityQueue
La PriorityQueue
classe fornisce l'implementazione di tutti i metodi presenti Queue
nell'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, ritornafalse
.
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 codapoll()
- 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.Iterator
pacchetto. 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' Comparator
interfaccia. 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' Comparator
interfaccia.
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.