微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

添加一些随机元素时,PriorityQueue 中的优先级将如何分配?

如何解决添加一些随机元素时,PriorityQueue 中的优先级将如何分配?

当我在 PriorityQueue 中添加一些随机数时,当我打印 PriorityQueue 时,元素以不同的顺序打印。

这是怎么回事?

示例

    PriorityQueue<Integer> s=new PriorityQueue<Integer>();
            s.add(22);
            s.add(212);
            s.add(423);
            s.add(323);
            s.add(1);
            System.out.print(s);

output:
    [1,22,423,323,212]

解决方法

它没有保证顺序(https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html):

方法Iterator 中提供的iterator() 和方法Spliterator 中提供的spliterator() 不能保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())

通常,您使用 poll() 方法根据元素的自然顺序检索元素,例如:

 while (!pq.isEmpty()) {
     var element = pq.poll();
     ...
 }
,

toString() 返回优先级队列内部存储的表示,而不是元素的逻辑顺序。 toArray() 和迭代也是如此:这些方法都不能保证元素将按其优先级顺序返回。

如果要按优先级顺序获取元素,则需要单独poll()它们(从而销毁队列)。因此,如果您想以特定顺序列出元素,PriorityQueue 不是合适的数据结构。 SortedSet 在这里更合适。相比之下,队列数据结构(其中 PriorityQueue 是一个特例)用于接收和检索元素一次,而不是用于检查静态数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。