2014-09-19 80 views
0

这是代码和输出低于它为什么值“5”和“6”我的意思是如何在PriorityQueue中的轮询方法(类似于队列中的其他元素)之后设置新的优先级。我正准备参加java认证考试,由于这个概念我总是倾向于选择错误的答案,欢迎任何帮助。为什么在Java中的poll方法之后,PriorityQueue中的值会发生变化?

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] 
+0

很难说了一些有趣的问题,而不会看到其他可能的答案。未指定打印元素的顺序。但是,您可以根据元素数量和显示的值得出结论。 – Thilo 2014-09-19 05:46:50

回答

2

值没有改变,它们只是以不同的顺序打印。
toString()对于PriorityQueue以它们的Iterator返回的顺序返回元素。如果你读的Javadoc PriorityQueue#iterator()你看到以下内容:

返回在此队列中的元素的迭代器。迭代器不会以任何特定顺序返回元素。

所以,你不能从您的打印得出任何结论,因为没有努力正在被PriorityQueue对打印他们在任何特定的顺序,按优先级或以其他方式。

2

the docspoll()

获取并移除此队列的头部,或返回null如果这个队列是空的。

如果你想peek at the head而不删除,请拨打peek()

获取,但不移除此队列的头,如果此队列为空,则返回null。

订购:优先级队列实现高性能[O(日志(n))的时间和入队dequeing,恒定时间检索]通过不排序的所有元素。它只是做一个部分排序来获取头部位置的最小元素。所以当继承的AbstractCollection#toString()方法遍历元素时,只有第一个按排序顺序。当你删除head元素时,会发生更多的排序,其他元素会改变相对位置。

请参阅维基百科以了解priority queues的工作原理。

1

对于考试记住的PriorityQueue随时在正确的顺序中的条目的第一条目和其他的可以为任何顺序,因为

迭代器在方法迭代器(提供)不能保证 横动元件以任何特定顺序排列优先级队列。

这一招救了我的时间来回答有关考试

+0

+1。但是它在toString()的哪个位置指定了哪个位置,即使第一个条目以正确的顺序打印? Javadoc似乎只是说“不能以任何特定顺序保证”。如果是这样,他们怎么能在考试中提出这个问题? (当然,根据其他答案的选择,可能还有其他线索)。 – Thilo 2014-09-19 05:45:48

相关问题