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

import java.util.*; class Priority{ public static void main(String args[]){ PriorityQueue queue=new PriorityQueue(); 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 

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

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

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

因此,如果您存储多个数字 – 2, 1, 4, 3, 6, 8 ,它将确保1是您删除的下一个元素。 然后当你删除1 ,它会移动2到头部。 它并不关心其余元素的排序。

大多数情况下,使用堆数据结构实现优先级队列。 堆是保证这一点的树

如果A是B的父,那么A

它不保证任何其他订购。 足以在恒定时间内提供最小元素,在日志时间中添加元素并在日志时间中删除密钥。

只是迭代器itr使用预订横向遍历堆。

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

这解释了你的结果。

注意:在java中是通过实现Comparable

这个问题在Javadoc中得到了解答:

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

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