为啥 PriorityQueue 的 toString 会乱序返回元素?
Posted
技术标签:
【中文标题】为啥 PriorityQueue 的 toString 会乱序返回元素?【英文标题】:Why does toString of PriorityQueue returns elements out of order?为什么 PriorityQueue 的 toString 会乱序返回元素? 【发布时间】:2021-04-26 10:22:59 【问题描述】:我有这个使用 PriorityQueue 的简单代码,我希望整数按降序存储。
PriorityQueue<Integer> jumps = new PriorityQueue<>(20,Collections.reverseOrder());
jumps.add(8);
jumps.add(5);
jumps.add(15);
jumps.add(2);
jumps.add(16);
System.out.println(jumps.toString());
打印出来
[16, 15, 8, 2, 5]
虽然我已经预料到了
[16, 15, 8, 5, 2]
我在这里做错了什么?
【问题讨论】:
【参考方案1】:PriorityQueue
的Iterator
返回的顺序是not guaranteed(强调他们的):
方法
iterator()
[...] [is] 不中提供的迭代器保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,可以考虑使用Arrays.sort(pq.toArray())
。
这是what toString()
uses,因此toString()
输出中元素的顺序也没有指定
保证的是多次调用poll()
将按适当的顺序返回值:
while (!jumps.isEmpty())
System.out.println(jumps.poll());
【讨论】:
好的,所以 PriorityQueue 的行为符合预期。只是 toString 调用了不保证顺序的迭代器。谢谢! @rajeshnair 您想在每次调用poll()
后观察toString()
的输出,并查看其实现。
@MarkRotteveel ,我已经广泛使用了 PriorityQueue 并且知道实现。当我看到这个输出时,我很困惑。我应该在发布问题之前进行更多探索以上是关于为啥 PriorityQueue 的 toString 会乱序返回元素?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能将 PriorityQueue 存储到 MongoDB 中
java - 为啥在java中的poll方法之后PriorityQueue中的值会发生变化? [复制]
为啥有些人使用 PriorityQueue 覆盖比较器函数来实现 minheap,即使 Java 中的 PQ 默认是最小堆?