首页 > Java > java教程 > 正文

为什么 PriorityQueue.toString() 不能准确反映 PriorityQueue 中项目的顺序?

Patricia Arquette
发布: 2024-10-31 05:25:02
原创
232 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!