java - 为啥在java中的poll方法之后PriorityQueue中的值会发生变化? [复制]
Posted
技术标签:
【中文标题】java - 为啥在java中的poll方法之后PriorityQueue中的值会发生变化? [复制]【英文标题】:Why do the values inside the PriorityQueue change after the poll method in java? [duplicate]java - 为什么在java中的poll方法之后PriorityQueue中的值会发生变化? [复制] 【发布时间】:2014-09-19 05:32:00 【问题描述】:这是代码,输出低于它为什么值 "5" 和 "6" 我的意思是在 PriorityQueue 中的 poll 方法之后如何设置新的优先级(类似于其他元素在队列中)。我正在准备 Java 认证考试,由于这个概念,我总是倾向于选择错误的答案,欢迎任何帮助。
import java.util.*;
public class PriorityQueueDemo
public static void main(String args[])
// create priority queue
PriorityQueue < Integer > prq = new PriorityQueue < Integer > ();
// insert values in the queue
for ( int i = 3; i < 10; i++ )
prq.add (new Integer (i)) ;
System.out.println ( "Initial priority queue values are: "+ prq);
// get the head from the queue
Integer head = prq.poll();
System.out.println ( "Head of the queue is: "+ head);
System.out.println ( "Priority queue values after poll: "+ prq);
输出:
Initial priority queue values are: [3, 4, 5, 6, 7, 8, 9]
Head of the queue is: 3
Priority queue values after poll: [4, 6, 5, 9, 7, 8]
【问题讨论】:
很难说没有看到其他可能的答案。未指定打印元素的顺序。但是您可以根据元素的数量和显示的值得出结论。 【参考方案1】:值没有改变,只是以不同的顺序打印。PriorityQueue
的 toString()
按其 Iterator
返回的顺序返回元素。如果您阅读 PriorityQueue#iterator()
的 Javadoc,您会看到以下内容:
返回此队列中元素的迭代器。迭代器不会以任何特定顺序返回元素。
因此,您无法从打印输出中得出任何结论,因为PriorityQueue
没有努力按任何特定顺序(按优先级或其他方式)打印它们。
【讨论】:
太棒了!谢谢。【参考方案2】:对于考试,请记住 PriorityQueue 总是以正确的顺序创建第一个条目,其余条目可以按任何顺序排列,因为
方法 iterator() 中提供的迭代器不能保证 以任何特定顺序遍历优先级队列的元素。
这个技巧节省了我在考试中回答一些技巧问题的时间
【讨论】:
+1。但是它是否在 toString() 以正确顺序打印第一个条目的任何地方指定? Javadoc 似乎只说“不保证以任何特定顺序”。如果是这样,他们怎么能在考试中问这个? (当然,根据其他答案选择,可能还有其他线索)。【参考方案3】:每the docs、poll()
获取并移除此队列的头部,如果此队列为空,则返回 null。
如果您想peek at the head 而不删除它,请致电peek()
检索但不删除此队列的头部,如果此队列为空,则返回 null。
顺序:优先队列通过不对所有元素进行排序来实现高性能[入队和出队的O(log(n))时间,检索的恒定时间]。它只进行部分排序以使最少元素到达头部位置。所以当继承的AbstractCollection#toString()
方法遍历元素时,只有第一个是有序的。当您删除 head 元素时,会发生更多排序,并且其他元素会更改相对位置。
请参阅 Wikipedia,了解 priority queues 的工作原理。
【讨论】:
以上是关于java - 为啥在java中的poll方法之后PriorityQueue中的值会发生变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
java中的string类中内容一旦被初始化就不能改变为啥还有replace方法呢?