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中文网其他相关文章!