首頁  >  文章  >  Java  >  為什麼 PriorityQueue.toString() 不能準確反映 PriorityQueue 中項目的順序?

為什麼 PriorityQueue.toString() 不能準確反映 PriorityQueue 中項目的順序?

Patricia Arquette
Patricia Arquette原創
2024-10-31 05:25:02214瀏覽

Why does PriorityQueue.toString() not accurately reflect the order of items in a PriorityQueue?

PriorityQueue.toString() 排序異常:解釋

當嘗試從PriorityQueue 檢索元素時,您可能會遇到意外行為,其中輸出順序與預期優先權不符。這是因為 PriorityQueue.toString() 僅提供佇列內部狀態的快照,這可能不代表排序順序。

要解決此問題,您應該輪詢,而不是依賴 toString()使用 poll() 方法從佇列中一項一項地取出項目。原因如下:

堆結構和隊列排序

在內部,PriorityQueue 利用堆資料結構來有效地維護排序順序。然而,堆並不總是完全排序的。相反,它是一個部分排序的樹,其中每個節點都與其父節點和子節點進行比較。

當您從佇列中新增或移除項目時,堆疊會進行調整以維持這種部分排序。因此,在佇列上呼叫 toString() 只會顯示目前狀態的快照,這可能與預期的優先權順序不一致。

解決方案:使用 Poll()

要按排序順序獲取元素,您應該使用 poll() 方法逐一輪詢它們。 poll() 方法在堆疊頂部進行操作,刪除根節點,同時保持剩餘節點的順序。

程式碼範例

為了說明這一點,請考慮對您的程式碼進行以下修改:

<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>

透過利用poll() 方法,現在您可以按刪除順序查看元素來自隊列:

[z, q, x, j, k, v, b, m, i, c, e, s, o, w, a, r, h, p, t, l, a]

這符合您首先獲取頻率最低的元素的期望。

以上是為什麼 PriorityQueue.toString() 不能準確反映 PriorityQueue 中項目的順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn