Java优先级队列应该如何工作?

简短的故事,我正在实现一个图表,现​​在我正在研究Kruskal,我需要一个优先级队列。 我对优先级队列的定义是具有最小密钥的元素将首先出现? 这是错的吗? 因为当我在队列中插入加权边(或数字)时,它们不会最终排序。

PriorityQueue tja = new PriorityQueue(); tja.add(55); tja.add(99); tja.add(1); tja.add(102); tja.add(54); tja.add(51); System.out.println(tja); 

那将打印出来; [1,54,51,102,99,55]。 这不像我希望的那样排序! 是的,我创建了一个进入优先级队列的comperator,该队列从edge对象中提取数字并根据该int进行比较。 所以这应该有用,或者我只是完全误解了这个数据结构如何工作的整个概念?

System.out.println正在调用使用迭代器的toString()方法,该方法不保证遵循自然顺序。 从文档 :“方法iterator()中提供的迭代器不保证以任何特定的顺序遍历优先级队列的元素。”

我没有Java中的PriorityQueue经验,但看起来优先级没有集成到iterator()toString() (使用iterator() )。

如果你这样做:

  while (tja.size()>0) System.out.println(tja.remove()); 

你得到了正确的结果。

你熟悉二进制堆的function吗? 如果没有,请通过min heap和max heap结构。 PriorityQueue是在堆上实现的。 PriorityQueue不会按递增顺序对项目进行排序,但会对其进行堆排序。

浏览链接: Priority Queue

你得到的输出是正确的。