V tomto tutoriáli sa pomocou príkladov dozvieme o triede PriorityQueue rámca kolekcií Java.
PriorityQueue
Trieda poskytuje funkčnosť haldy dátové štruktúry.
Implementuje rozhranie fronty.
Na rozdiel od bežných frontov sa prvky prioritných frontov načítajú v zoradenom poradí.
Predpokladajme, že chceme načítať prvky vo vzostupnom poradí. V tomto prípade bude hlava prioritného frontu najmenším prvkom. Po načítaní tohto prvku bude nasledujúcim najmenším prvkom hlava v poradí.
Je dôležité si uvedomiť, že prvky prioritného frontu sa nemusia dať triediť. Elementy sa však vždy načítajú v zoradenom poradí.
Vytvára sa prioritná fronta
Aby sme vytvorili prioritný front, musíme java.util.PriorityQueue
balíček importovať . Po importovaní balíka tu môžeme vytvoriť prioritný front v Jave.
PriorityQueue numbers = new PriorityQueue();
Tu sme vytvorili prioritný front bez akýchkoľvek argumentov. V tomto prípade je hlava prioritného frontu najmenším prvkom frontu. A prvky sa z frontu odstránia vzostupne.
Usporiadanie prvkov však môžeme upraviť pomocou Comparator
rozhrania. O tom sa dozvieme neskôr v tomto návode.
Metódy PriorityQueue
PriorityQueue
Trieda poskytuje vykonávanie všetkých metód prítomných v Queue
rozhraní.
Vložte prvky do PriorityQueue
add()
- Vloží zadaný prvok do poradia. Ak je poradie plné, vyvolá to výnimku.offer()
- Vloží zadaný prvok do poradia. Ak je poradie plné, vráti safalse
.
Napríklad,
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); ) )
Výkon
PriorityQueue: (2, 4) Aktualizovaná PriorityQueue: (1, 4, 2)
Tu sme vytvorili prioritný front s názvom čísla. Do fronty sme vložili 4 a 2.
Aj keď je 4 vložené pred 2, hlava frontu je 2. Je to preto, že hlava prioritného frontu je najmenším prvkom frontu.
Potom sme vložili 1 do poradia. Poradie je teraz preskupené tak, aby ukladalo najmenší prvok 1 do čela poradia.
Prístup k prvkom PriorityQueue
Na prístup k prvkom z prioritného frontu môžeme použiť peek()
metódu. Táto metóda vráti hlavičku frontu. Napríklad,
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); ) )
Výkon
Prioritná fronta: (1, 4, 2) Prístup k prvku: 1
Odstrániť prvky PriorityQueue
remove()
- odstráni zadaný prvok z frontupoll()
- vráti a odstráni hlavu frontu
Napríklad,
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); ) )
Výkon
PriorityQueue: (1, 4, 2) Je prvok 2 odstránený? true Odstránený prvok pomocou poll (): 1
Iterácia cez prioritnú frontu
Na opakovanie prvkov prioritného frontu môžeme použiť túto iterator()
metódu. Aby sme mohli použiť túto metódu, musíme java.util.Iterator
balíček importovať . Napríklad,
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(", "); ) ) )
Výkon
PriorityQueue pomocou iterátora (): 1, 4, 2,
Ďalšie metódy PriorityQueue
Metódy | Popisy |
---|---|
contains(element) | Vyhľadá prioritný rad pre zadaný prvok. Ak sa prvok nájde, vráti sa true , ak nie, vráti sa false . |
size() | Vráti dĺžku prioritného frontu. |
toArray() | Skonvertuje prioritný front na pole a vráti ho. |
Porovnávač priority
Vo všetkých vyššie uvedených príkladoch sa prioritné prvky frontu načítajú v prirodzenom poradí (vzostupne). Toto objednávanie však môžeme prispôsobiť.
Z tohto dôvodu musíme vytvoriť našu vlastnú komparatívnu triedu, ktorá implementuje Comparator
rozhranie. Napríklad,
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; ) ) )
Výkon
Prioritná fronta: (4, 3, 1, 2)
Vo vyššie uvedenom príklade sme vytvorili prioritný front, ktorý ako argument odovzdáva triedu CustomComparator.
Trieda CustomComparator implementuje Comparator
rozhranie.
Potom compare()
metódu prepíšeme . Metóda teraz spôsobí, že hlava prvku bude najväčšie číslo.
Ak sa chcete dozvedieť viac informácií o komparátore, navštívte Java Comparator.