W tym samouczku dowiemy się na temat klasy PriorityQueue struktury kolekcji Java na podstawie przykładów.
PriorityQueue
Klasa zapewnia funkcjonalność sterty struktury danych.
Implementuje interfejs Queue.
W przeciwieństwie do zwykłych kolejek, priorytetowe elementy kolejki są pobierane w kolejności posortowanej.
Załóżmy, że chcemy pobrać elementy w porządku rosnącym. W tym przypadku główka kolejki priorytetowej będzie najmniejszym elementem. Po pobraniu tego elementu następny najmniejszy element będzie głową kolejki.
Należy zauważyć, że elementy kolejki priorytetowej nie mogą być sortowane. Jednak elementy są zawsze pobierane w kolejności posortowanej.
Tworzenie PriorityQueue
Aby utworzyć kolejkę priorytetową, musimy zaimportować java.util.PriorityQueue
pakiet. Po zaimportowaniu pakietu, oto jak możemy utworzyć kolejkę priorytetową w Javie.
PriorityQueue numbers = new PriorityQueue();
Tutaj utworzyliśmy kolejkę priorytetową bez żadnych argumentów. W tym przypadku czoło kolejki priorytetowej jest najmniejszym elementem kolejki. A elementy są usuwane w kolejności rosnącej z kolejki.
Możemy jednak dostosować kolejność elementów za pomocą Comparator
interfejsu. Dowiemy się o tym w dalszej części tego samouczka.
Metody PriorityQueue
PriorityQueue
Klasa zapewnia realizację wszystkich metod obecnych w Queue
interfejsie.
Wstaw elementy do PriorityQueue
add()
- Wstawia określony element do kolejki. Jeśli kolejka jest pełna, zgłasza wyjątek.offer()
- Wstawia określony element do kolejki. Jeśli kolejka jest pełna, zwracafalse
.
Na przykład,
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); ) )
Wynik
PriorityQueue: (2, 4) Zaktualizowano PriorityQueue: (1, 4, 2)
Tutaj stworzyliśmy kolejkę priorytetową o nazwie Numery. Wstawiliśmy 4 i 2 do kolejki.
Chociaż 4 jest wstawiane przed 2, początek kolejki to 2. Dzieje się tak, ponieważ głowa kolejki priorytetowej jest najmniejszym elementem kolejki.
Następnie wstawiliśmy 1 do kolejki. Kolejka jest teraz uporządkowana tak, aby przechowywać najmniejszy element 1 na początku kolejki.
Uzyskaj dostęp do elementów PriorityQueue
Aby uzyskać dostęp do elementów z kolejki priorytetowej, możemy użyć peek()
metody. Ta metoda zwraca początek kolejki. Na przykład,
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); ) )
Wynik
PriorityQueue: (1, 4, 2) Dostęp do elementu: 1
Usuń elementy PriorityQueue
remove()
- usuwa określony element z kolejkipoll()
- wraca i usuwa nagłówek kolejki
Na przykład,
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); ) )
Wynik
PriorityQueue: (1, 4, 2) Czy element 2 został usunięty? true Usunięty element za pomocą funkcji poll (): 1
Iteracja po PriorityQueue
Aby dokonać iteracji po elementach kolejki priorytetowej, możemy użyć iterator()
metody. Aby skorzystać z tej metody, musimy zaimportować java.util.Iterator
pakiet. Na przykład,
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(", "); ) ) )
Wynik
PriorityQueue przy użyciu iteratora (): 1, 4, 2,
Inne metody PriorityQueue
Metody | Opisy |
---|---|
contains(element) | Przeszukuje kolejkę priorytetów dla określonego elementu. Jeśli element zostanie znaleziony, zwraca true , jeśli nie, zwraca false . |
size() | Zwraca długość kolejki priorytetowej. |
toArray() | Konwertuje kolejkę priorytetową na tablicę i zwraca ją. |
PriorityQue Comparator
We wszystkich powyższych przykładach priorytetowe elementy kolejki są pobierane w kolejności naturalnej (rosnącej). Możemy jednak dostosować tę kolejność.
W tym celu musimy stworzyć własną klasę porównawczą, która implementuje Comparator
interfejs. Na przykład,
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; ) ) )
Wynik
PriorityQueue: (4, 3, 1, 2)
W powyższym przykładzie utworzyliśmy kolejkę priorytetową przekazującą jako argument klasę CustomComparator.
Klasa CustomComparator implementuje Comparator
interfejs.
Następnie nadpisujemy compare()
metodę. Metoda powoduje teraz, że nagłówek elementu będzie największą liczbą.
Aby dowiedzieć się więcej o komparatorze, odwiedź stronę Java Comparator.