English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In diesem Tutorial werden wir anhand von Beispielen die PriorityQueue-Klasse der Java Collection-Frameworks lernen.
Die PriorityQueue-Klasse bietet die Funktionen des Heap-Datenstruktur.
Es implementiertQueue-Schnittstelle
Im Gegensatz zur normalen Queue werden die Elemente der Prioritätsqueue in der sortierten Reihenfolge abgerufen.
Angenommen, wir möchten die Elemente in aufsteigender Reihenfolge abrufen. In diesem Fall ist der Kopf der Prioritätsqueue das kleinste Element. Nachdem dieses Element abgerufen wurde, wird das nächste kleinste Element der Kopf der Queue.
Zu beachten ist, dass die Elemente der Prioritätsqueue möglicherweise nicht sortiert sind. Allerdings werden die Elemente immer in der sortierten Reihenfolge abgerufen.
Um eine Prioritätsquelle zu erstellen, müssen wir das Paket java.util.PriorityQueue importieren. Nachdem das Paket importiert wurde, können wir die folgenden Methoden verwenden, um eine Prioritätsquelle in Java zu erstellen.
PriorityQueue<Integer> zahlen = new PriorityQueue<>();
Hier erstellen wir eine Prioritätsquelle ohne Parameter. In diesem Fall ist der Kopf der Prioritätsquelle das kleinste Element in der Reihe. Elemente werden in aufsteigender Reihenfolge aus der Reihe entfernt.
Wir können jedoch mithilfe des Comparator-Interfaces die Reihenfolge der Elemente anpassen. Dies werden wir im späteren Teil des Tutorials erläutern.
Die Klasse PriorityQueue bietet alle Methoden, die im Queue-Interface vorhanden sind, als Implementierung.
add() - Fügen Sie das angegebene Element in die Reihe ein. Wenn die Reihe voll ist, wird eine Ausnahme ausgelöst.
offer() - Fügen Sie das angegebene Element in die Reihe ein. Wenn die Reihe voll ist, wird false zurückgegeben.
Beispielsweise,
import java.util.PriorityQueue; class Main { public static void main(String[] args) { //Erstellen Sie eine Prioritätsquelle PriorityQueue<Integer> zahlen = new PriorityQueue<>(); //Verwenden Sie die add()-Methode zahlen.add(4); zahlen.add(2); System.out.println("PriorityQueue: ") + numbers);}} //Verwenden Sie die offer()-Methode numbers.offer(1); System.out.println("Aktualisierte PriorityQueue: ") + numbers);}} } }
Ausgaberesultat
PriorityQueue: [2, 4] Aktualisierte PriorityQueue: [1, 4, 2]
Hier erstellen wir eine Prioritätsquelle namens numbers. Wir haben4und2in die Reihe eingefügt werden.
obwohl4hineingefügt wurde2vorher, aber der Kopf der Reihe ist2. Dies liegt daran, dass der Kopf der Prioritätsquelle das kleinste Element in der Reihe ist.
Dann werden wir1Die Reihe neu anordnen, um den kleinsten Element1Am Anfang der Reihe speichern.
Um Elemente aus der Prioritätsquelle zu erreichen, können wir die peek()-Methode verwenden. Diese Methode gibt den Kopf der Reihe zurück. Zum Beispiel,
import java.util.PriorityQueue; class Main { public static void main(String[] args) { // Erstellen Sie eine Prioritätsliste PriorityQueue<Integer> zahlen = new PriorityQueue<>(); zahlen.add(4); zahlen.add(2); zahlen.add(1); System.out.println("PriorityQueue: ") + numbers);}} //Verwenden Sie die peek()-Methode int number = numbers.peek(); System.out.println("Anzeigen von Elementen: ") + number); } }
Ausgaberesultat
PriorityQueue: [1, 4, 2] Elemente anzeigen: 1
remove() - Löschen eines bestimmten Elements aus der Reihe
poll() - Rückgabe und Löschen des Kopfes der Reihe
Beispielsweise,
import java.util.PriorityQueue; class Main { public static void main(String[] args) { // Erstellen Sie eine Prioritätsquelle PriorityQueue<Integer> zahlen = new PriorityQueue<>(); zahlen.add(4); zahlen.add(2); zahlen.add(1); System.out.println("PriorityQueue: ") + numbers);}} //Verwenden Sie die remove()-Methode boolean result = numbers.remove(2); System.out.println("Element")2Bereits gelöscht? \ + result); //Verwenden Sie die poll()-Methode int number = numbers.poll(); System.out.println("Verwenden Sie poll() gelöschte Elemente: ") + number); } }
Ausgaberesultat
PriorityQueue: [1, 4, 2] Element2Bereits gelöscht? true Das durch poll() gelöschte Element: 1
Um die Elemente der Prioritätsliste zu durchlaufen, können wir das iterator()-Method verwenden. Um diese Methode zu verwenden, müssen wir das Paket java.util.Iterator importieren. Zum Beispiel
import java.util.PriorityQueue; import java.util.Iterator; class Main { public static void main(String[] args) { //Erstellen Sie eine Prioritätsliste PriorityQueue<Integer> zahlen = new PriorityQueue<>(); zahlen.add(4); zahlen.add(2); zahlen.add(1); System.out.print("Verwenden Sie iterator() zur Durchlauf von PriorityQueue: "); //Verwenden Sie das iterator()-Method Iterator<Integer> iterate = zahlen.iterator(); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
Ausgaberesultat
Verwenden Sie iterator() zur Durchlauf von PriorityQueue: 1, 4, 2,
Methode | Inhaltsbeschreibung |
---|---|
contains(element) | Suchen Sie das angegebene Element in der Prioritätsliste. Wenn das Element gefunden wird, wird true zurückgegeben, andernfalls false. |
size() | Geben Sie die Länge der Prioritätsliste zurück. |
toArray() | Konvertieren Sie die Prioritätsliste in ein Array und geben Sie es zurück. |
In allen obigen Beispielen werden die Elemente der Prioritätsliste nach natürlicher Ordnung (aufsteigend) abgerufen. Aber wir können diese Ordnung selbst festlegen.
Daher müssen wir unsere eigene Comparator-Klasse erstellen, die das Comparator-Interface implementiert. Zum Beispiel
import java.util.PriorityQueue; import java.util.Comparator; class Main { public static void main(String[] args) { //Erstellen Sie eine Prioritätsliste PriorityQueue<Integer> zahlen = new PriorityQueue<>(new CustomComparator()); zahlen.add(4); zahlen.add(2); zahlen.add(1); zahlen.add(3); System.out.print("PriorityQueue: " + numbers);}} } } class CustomComparator implements Comparator<Integer> { @Override public int compare(Integer number1, Integer number2) { int value = number1.compareTo(number2); //Die Elemente werden in umgekehrter Reihenfolge sortiert if (value > 0) { return -1; } else if (value < 0) { return 1; } else { return 0; } } }
Ausgaberesultat
PriorityQueue: [4, 3, 1, 2]
Im obigen Beispiel haben wir eine Prioritäts-Warteschlange erstellt und die Klasse CustomComparator als Parameter übergeben.
Die Klasse CustomComparator implementiert die Comparator-Schnittstelle.
Dann überschreiben wir die compare() Methode. Diese Methode macht jetzt den Kopf des Elements zur größten Zahl.