PriorityQueue.toString() Sortieranomalie: erklärt
Beim Versuch, Elemente aus einer PriorityQueue abzurufen, kann es bei der Ausgabe zu unerwartetem Verhalten kommen Die Reihenfolge stimmt nicht mit der erwarteten Priorität überein. Dies liegt daran, dass PriorityQueue.toString() nur eine Momentaufnahme des internen Status der Warteschlange bereitstellt, die möglicherweise nicht die sortierte Reihenfolge darstellt.
Um dieses Problem zu beheben, sollten Sie eine Umfrage durchführen, anstatt sich auf toString() zu verlassen Elemente aus der Warteschlange nacheinander mit der Methode poll() abrufen. Hier ist der Grund:
Heap-Struktur und Warteschlangenreihenfolge
Intern nutzt PriorityQueue eine Heap-Datenstruktur, um die sortierte Reihenfolge effizient aufrechtzuerhalten. Allerdings ist der Heap nicht immer vollständig sortiert. Stattdessen handelt es sich um einen teilweise geordneten Baum, in dem jeder Knoten mit seinen übergeordneten und untergeordneten Knoten verglichen wird.
Wenn Sie Elemente zur Warteschlange hinzufügen oder daraus entfernen, wird der Heap angepasst, um diese teilweise Reihenfolge beizubehalten. Daher wird beim Aufruf von toString() in der Warteschlange nur eine Momentaufnahme des aktuellen Status angezeigt, die möglicherweise nicht mit der erwarteten Prioritätsreihenfolge übereinstimmt.
Lösung: Verwenden von Poll()
Um die Elemente in sortierter Reihenfolge zu erhalten, sollten Sie sie einzeln mit der Methode poll() abfragen. Die poll()-Methode arbeitet oben auf dem Heap und entfernt den Wurzelknoten, während die Reihenfolge der verbleibenden Knoten beibehalten wird.
Codebeispiel
Zur Veranschaulichung: Erwägen Sie die folgende Änderung an Ihrem Code:
<code class="java">import java.util.Comparator; import java.util.PriorityQueue; public class TreeNodeHuffman { public static void main(String[] args) { HuffmanComparator compare = new HuffmanComparator(); // Create and initialize PriorityQueue PriorityQueue<TreeNodeHuffman> queue = new PriorityQueue<>(26, compare); // ... Add nodes to the queue // Poll and print items while (!queue.isEmpty()) { System.out.println(queue.poll()); } } }</code>
Durch die Verwendung der poll()-Methode können Sie nun die Elemente in sortierter Reihenfolge sehen, wenn sie aus der Warteschlange entfernt werden:
[z, q, x, j, k, v, b, m, i, c, e, s, o, w, a, r, h, p, t, l, a]
Dies entspricht Ihrer Erwartung, zuerst Elemente mit der niedrigsten Häufigkeit zu erhalten.
Das obige ist der detaillierte Inhalt vonWarum spiegelt PriorityQueue.toString() die Reihenfolge der Elemente in einer PriorityQueue nicht genau wider?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!