În acest tutorial, vom afla despre clasa PriorityQueue din cadrul colecțiilor Java cu ajutorul exemplelor.
PriorityQueue
Clasa asigură funcționalitatea structurii de date heap.
Implementează interfața Queue.
Spre deosebire de cozile normale, elementele de coadă prioritare sunt recuperate în ordine sortată.
Să presupunem că vrem să preluăm elemente în ordine crescătoare. În acest caz, capul cozii de prioritate va fi cel mai mic element. Odată ce acest element este recuperat, cel mai mic element următor va fi capul cozii.
Este important să rețineți că elementele unei cozi prioritare pot să nu fie sortate. Cu toate acestea, elementele sunt întotdeauna recuperate în ordine sortată.
Crearea PriorityQueue
Pentru a crea o coadă prioritară, trebuie să importăm java.util.PriorityQueue
pachetul. Odată ce am importat pachetul, iată cum putem crea o coadă prioritară în Java.
PriorityQueue numbers = new PriorityQueue();
Aici, am creat o coadă de prioritate fără niciun argument. În acest caz, capul cozii prioritare este cel mai mic element al cozii. Și elementele sunt eliminate în ordine crescătoare din coadă.
Cu toate acestea, putem personaliza ordonarea elementelor cu ajutorul Comparator
interfeței. Vom afla despre asta mai târziu în acest tutorial.
Metode PriorityQueue
PriorityQueue
Clasa asigură punerea în aplicare a tuturor metodelor prezente în Queue
interfața.
Introduceți elemente în PriorityQueue
add()
- Inserează elementul specificat în coadă. Dacă coada este plină, aruncă o excepție.offer()
- Inserează elementul specificat în coadă. Dacă coada este plină, se întoarcefalse
.
De exemplu,
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); ) )
Ieșire
PriorityQueue: (2, 4) PriorityQueue actualizat: (1, 4, 2)
Aici, am creat o coadă prioritară numită numere. Am introdus 4 și 2 în coadă.
Deși 4 este introdus înainte de 2, capul cozii este 2. Acest lucru se datorează faptului că capul cozii prioritare este cel mai mic element al cozii.
Am inserat apoi 1 în coadă. Coada este acum rearanjată pentru a stoca cel mai mic element 1 în capul cozii.
Accesați elementele PriorityQueue
Pentru a accesa elemente dintr-o coadă prioritară, putem folosi peek()
metoda. Această metodă returnează capul cozii. De exemplu,
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); ) )
Ieșire
PriorityQueue: (1, 4, 2) Element accesat: 1
Eliminați elementele PriorityQueue
remove()
- elimină elementul specificat din coadăpoll()
- returnează și elimină capul cozii
De exemplu,
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); ) )
Ieșire
PriorityQueue: (1, 4, 2) Elementul 2 este eliminat? adevărat Element eliminat Folosind poll (): 1
Iterarea peste o coadă prioritară
Pentru a repeta elementele unei cozi prioritare, putem folosi iterator()
metoda. Pentru a utiliza această metodă, trebuie să importăm java.util.Iterator
pachetul. De exemplu,
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(", "); ) ) )
Ieșire
PriorityQueue folosind iteratorul (): 1, 4, 2,
Alte metode PriorityQueue
Metode | Descrieri |
---|---|
contains(element) | Caută coada de prioritate pentru elementul specificat. Dacă elementul este găsit, se întoarce true , dacă nu, se întoarce false . |
size() | Returnează lungimea cozii de prioritate. |
toArray() | Convertește o coadă de prioritate într-o matrice și o returnează. |
Comparator PriorityQueue
În toate exemplele de mai sus, elementele de coadă prioritare sunt recuperate în ordinea naturală (ordine crescătoare). Cu toate acestea, putem personaliza această comandă.
Pentru aceasta, trebuie să creăm propria noastră clasă de comparare care implementează Comparator
interfața. De exemplu,
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; ) ) )
Ieșire
PriorityQueue: (4, 3, 1, 2)
În exemplul de mai sus, am creat o coadă prioritară care trece clasa CustomComparator ca argument.
Clasa CustomComparator implementează Comparator
interfața.
Apoi, anulăm compare()
metoda. Metoda face acum ca capul elementului să fie cel mai mare număr.
Pentru a afla mai multe despre comparator, accesați Java Comparator.