In deze tutorial leren we met behulp van voorbeelden over de PriorityQueue-klasse van het Java Collections-framework.
De PriorityQueue
klasse biedt de functionaliteit van de heap-gegevensstructuur.
Het implementeert de wachtrij-interface.
In tegenstelling tot normale wachtrijen worden prioritaire wachtrijelementen in gesorteerde volgorde opgehaald.
Stel dat we elementen in oplopende volgorde willen ophalen. In dit geval is de kop van de prioriteitswachtrij het kleinste element. Zodra dit element is opgehaald, wordt het volgende kleinste element de kop van de wachtrij.
Het is belangrijk op te merken dat de elementen van een prioriteitswachtrij mogelijk niet zijn gesorteerd. Elementen worden echter altijd in gesorteerde volgorde opgehaald.
PriorityQueue maken
Om een prioriteitswachtrij te maken, moeten we het java.util.PriorityQueue
pakket importeren . Nadat we het pakket hebben geïmporteerd, kunnen we als volgt een prioriteitswachtrij in Java maken.
PriorityQueue numbers = new PriorityQueue();
Hier hebben we een prioriteitswachtrij gemaakt zonder argumenten. In dit geval is de kop van de prioriteitswachtrij het kleinste element van de wachtrij. En elementen worden in oplopende volgorde uit de wachtrij verwijderd.
We kunnen de volgorde van elementen echter aanpassen met behulp van de Comparator
interface. We zullen daar later in deze tutorial over leren.
Methoden van PriorityQueue
De PriorityQueue
klasse zorgt voor de implementatie van alle methoden die in de Queue
interface aanwezig zijn.
Voeg elementen toe aan PriorityQueue
add()
- Voegt het opgegeven element in de wachtrij in. Als de wachtrij vol is, wordt er een uitzondering gegenereerd.offer()
- Voegt het opgegeven element in de wachtrij in. Als de wachtrij vol is, keert deze terugfalse
.
Bijvoorbeeld,
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); ) )
Uitvoer
PriorityQueue: (2, 4) Bijgewerkte PriorityQueue: (1, 4, 2)
Hier hebben we een prioriteitswachtrij gemaakt met de naam nummers. We hebben 4 en 2 in de wachtrij geplaatst.
Hoewel 4 wordt ingevoegd vóór 2, is de kop van de wachtrij 2. Dit komt doordat de kop van de prioriteitswachtrij het kleinste element van de wachtrij is.
We hebben er dan 1 in de wachtrij geplaatst. De wachtrij is nu herschikt om het kleinste element 1 aan de kop van de wachtrij op te slaan.
Toegang tot PriorityQueue-elementen
Om toegang te krijgen tot elementen uit een prioriteitswachtrij, kunnen we de peek()
methode gebruiken. Deze methode retourneert de kop van de wachtrij. Bijvoorbeeld,
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); ) )
Uitvoer
PriorityQueue: (1, 4, 2) Betreden element: 1
Verwijder PriorityQueue-elementen
remove()
- verwijdert het opgegeven element uit de wachtrijpoll()
- keert terug en verwijdert de kop van de wachtrij
Bijvoorbeeld,
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); ) )
Uitvoer
PriorityQueue: (1, 4, 2) Is element 2 verwijderd? true Verwijderd element met poll (): 1
Itereren over een PriorityQueue
Om de elementen van een prioriteitswachtrij te herhalen, kunnen we de iterator()
methode gebruiken. Om deze methode te gebruiken, moeten we het java.util.Iterator
pakket importeren . Bijvoorbeeld,
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(", "); ) ) )
Uitvoer
PriorityQueue met iterator (): 1, 4, 2,
Andere PriorityQueue-methoden
Methoden | Beschrijvingen |
---|---|
contains(element) | Zoekt in de prioriteitswachtrij naar het opgegeven element. Als het element wordt gevonden, keert het terug true , zo niet, dan keert het terug false . |
size() | Retourneert de lengte van de prioriteitswachtrij. |
toArray() | Converteert een prioriteitswachtrij naar een array en retourneert deze. |
PriorityQueue Comparator
In alle bovenstaande voorbeelden worden prioriteitswachtrijelementen opgehaald in de natuurlijke volgorde (oplopende volgorde). We kunnen deze volgorde echter aanpassen.
Hiervoor moeten we onze eigen comparator-klasse maken die de Comparator
interface implementeert . Bijvoorbeeld,
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; ) ) )
Uitvoer
PriorityQueue: (4, 3, 1, 2)
In het bovenstaande voorbeeld hebben we een prioriteitswachtrij gemaakt die de klasse CustomComparator als een argument doorgeeft.
De CustomComparator-klasse implementeert de Comparator
interface.
We overschrijven dan de compare()
methode. De methode zorgt er nu voor dat de kop van het element het grootste getal is.
Bezoek Java Comparator voor meer informatie over de comparator.