通过PriorityQueue迭代不会产生有序结果

时间:2014-03-06 15:41:35

标签: java data-structures priority-queue

import java.util.*;
class Priority{  
public static void main(String args[]){  

PriorityQueue<String> queue=new PriorityQueue<String>();  
queue.add("Amit");  
queue.add("Vijay");  
queue.add("Karan");  
queue.add("Jai");  
queue.add("Rahul");  

System.out.println("head:"+queue.element());  
System.out.println("head:"+queue.peek());  

System.out.println("iterating the queue elements:");  
Iterator itr=queue.iterator();  
while(itr.hasNext()){  
System.out.println(itr.next());  
}  

queue.remove();  
queue.poll();  

System.out.println("after removing two elements:");  
Iterator itr2=queue.iterator();  
while(itr2.hasNext()){  
System.out.println(itr2.next());  
}  

}  
}  

Output:head:Amit
   head:Amit
   iterating the queue elements:
   Amit
   Jai
   Karan
   Vijay
   Rahul
   after removing two elements:
   Karan
   Rahul
   Vijay

您好我正在尝试学习java中的集合下的优先级队列(如上所示)。现在我真的很困惑,因为输出。我无法理解输出是如何产生的(如上所示)。

iterating the queue elements:
   Amit
   Jai
   Karan
   Vijay
   Rahul

在rahul之前vijay是怎么来的?如果它按字母顺序排列rahul必须在vijay之前出现我猜。

所以任何人都可以解释在程序和方法元素()中发生的事情是什么?我找不到那种方法。

3 个答案:

答案 0 :(得分:2)

PriorityQueue不按排序顺序存储元素,但它允许您按排序顺序从中获取元素。它只是确保头部的元素是按照它使用的排序的最小元素。

因此,如果您存储多个号码 - 2, 1, 4, 3, 6, 8,则会确保1是您删除的下一个元素。然后,当您移除1时,它会将2移至头部。它并不关心其余元素的排序。

答案 1 :(得分:0)

大多数情况下,使用heap datastructure实现优先级队列。堆是保证

的树
  

如果A是B的父亲,那么A&lt;乙

它不保证任何其他订购。在常量时间内提供最小元素,在日志时间中添加元素以及在日志时间中删除密钥就足够了。

只是迭代器itr使用pre-order transversal遍历堆。

Traverse(node)
   visit(node)
   Traverse(node.left())
   Traverse(node.right())

这解释了你的结果。

注意:在java中<是通过实施Comparable<T>

提供的

答案 2 :(得分:0)

Javadoc

回答了这个问题
方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。

要按排序顺序遍历PQ,您必须使用remove()方法。