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】:

值没有改变,只是以不同的顺序打印。PriorityQueuetoString() 按其 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 中的 URL:为啥不考虑“+”之后的字符串部分?

Java 相当于 C 的 poll()?

java中的string类中内容一旦被初始化就不能改变为啥还有replace方法呢?

Java优先队列一些问题

java Queue中 remove/poll, add/offer, element/peek区别

java新手为啥java类中要有static静态方法?