In diesem Tutorial lernen wir anhand von Beispielen die PriorityQueue-Klasse des Java-Sammlungsframeworks kennen.
Die PriorityQueue
Klasse bietet die Funktionalität der Heap-Datenstruktur.
Es implementiert die Warteschlangenschnittstelle.
Im Gegensatz zu normalen Warteschlangen werden Prioritätswarteschlangenelemente in sortierter Reihenfolge abgerufen.
Angenommen, wir möchten Elemente in aufsteigender Reihenfolge abrufen. In diesem Fall ist der Kopf der Prioritätswarteschlange das kleinste Element. Sobald dieses Element abgerufen wurde, ist das nächstkleinere Element der Kopf der Warteschlange.
Es ist wichtig zu beachten, dass die Elemente einer Prioritätswarteschlange möglicherweise nicht sortiert sind. Elemente werden jedoch immer in sortierter Reihenfolge abgerufen.
PriorityQueue erstellen
Um eine Prioritätswarteschlange zu erstellen, müssen wir das java.util.PriorityQueue
Paket importieren . Sobald wir das Paket importiert haben, können wir wie folgt eine Prioritätswarteschlange in Java erstellen.
PriorityQueue numbers = new PriorityQueue();
Hier haben wir eine Prioritätswarteschlange ohne Argumente erstellt. In diesem Fall ist der Kopf der Prioritätswarteschlange das kleinste Element der Warteschlange. Und Elemente werden in aufsteigender Reihenfolge aus der Warteschlange entfernt.
Wir können jedoch die Reihenfolge der Elemente mithilfe der Comparator
Benutzeroberfläche anpassen . Wir werden später in diesem Tutorial mehr darüber erfahren.
Methoden von PriorityQueue
Die PriorityQueue
Klasse bietet die Implementierung aller in der Queue
Schnittstelle vorhandenen Methoden .
Fügen Sie Elemente in PriorityQueue ein
add()
- Fügt das angegebene Element in die Warteschlange ein. Wenn die Warteschlange voll ist, wird eine Ausnahme ausgelöst.offer()
- Fügt das angegebene Element in die Warteschlange ein. Wenn die Warteschlange voll ist, wird sie zurückgegebenfalse
.
Beispielsweise,
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); ) )
Ausgabe
PriorityQueue: (2, 4) Aktualisierte PriorityQueue: (1, 4, 2)
Hier haben wir eine Prioritätswarteschlange mit dem Namen "Nummern" erstellt. Wir haben 4 und 2 in die Warteschlange eingefügt.
Obwohl 4 vor 2 eingefügt wird, ist der Kopf der Warteschlange 2. Dies liegt daran, dass der Kopf der Prioritätswarteschlange das kleinste Element der Warteschlange ist.
Wir haben dann 1 in die Warteschlange eingefügt. Die Warteschlange wird jetzt neu angeordnet, um das kleinste Element 1 im Kopf der Warteschlange zu speichern.
Greifen Sie auf PriorityQueue-Elemente zu
Um auf Elemente aus einer Prioritätswarteschlange zuzugreifen, können wir die peek()
Methode verwenden. Diese Methode gibt den Kopf der Warteschlange zurück. Beispielsweise,
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); ) )
Ausgabe
PriorityQueue: (1, 4, 2) Zugriffselement: 1
Entfernen Sie PriorityQueue-Elemente
remove()
- Entfernt das angegebene Element aus der Warteschlangepoll()
- gibt den Kopf der Warteschlange zurück und entfernt ihn
Beispielsweise,
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); ) )
Ausgabe
PriorityQueue: (1, 4, 2) Wird das Element 2 entfernt? true Entferntes Element mit poll (): 1
Iterieren über eine PriorityQueue
Um die Elemente einer Prioritätswarteschlange zu durchlaufen, können wir die iterator()
Methode verwenden. Um diese Methode verwenden zu können, müssen wir das java.util.Iterator
Paket importieren . Beispielsweise,
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(", "); ) ) )
Ausgabe
PriorityQueue mit iterator (): 1, 4, 2,
Andere PriorityQueue-Methoden
Methoden | Beschreibungen |
---|---|
contains(element) | Durchsucht die Prioritätswarteschlange nach dem angegebenen Element. Wenn das Element gefunden wird, wird es zurückgegeben true , wenn nicht, wird es zurückgegeben false . |
size() | Gibt die Länge der Prioritätswarteschlange zurück. |
toArray() | Konvertiert eine Prioritätswarteschlange in ein Array und gibt es zurück. |
PriorityQueue-Komparator
In allen obigen Beispielen werden Prioritätswarteschlangenelemente in der natürlichen Reihenfolge (aufsteigende Reihenfolge) abgerufen. Wir können diese Bestellung jedoch anpassen.
Dazu müssen wir eine eigene Komparatorklasse erstellen, die die Comparator
Schnittstelle implementiert . Beispielsweise,
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; ) ) )
Ausgabe
PriorityQueue: (4, 3, 1, 2)
Im obigen Beispiel haben wir eine Prioritätswarteschlange erstellt, die die CustomComparator-Klasse als Argument übergibt.
Die CustomComparator-Klasse implementiert die Comparator
Schnittstelle.
Wir überschreiben dann die compare()
Methode. Die Methode bewirkt nun, dass der Kopf des Elements die größte Zahl ist.
Um mehr über den Komparator zu erfahren, besuchen Sie Java Comparator.