2009-11-25 53 views
5

小故事,我正在实施一个图表,现​​在我正在克鲁斯卡尔工作,我需要一个优先级队列。我对优先级队列的定义是,具有最小密钥的元素会先出现?这是错的吗?因为当我在队列中插入加权边(或数字)时,它们不会最终排序。Java优先级队列应该如何工作?

PriorityQueue<Integer> tja = new PriorityQueue<Integer>(); 
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]。这不是按照我希望的那样排序!是的,我创建了一个进入优先级队列的竞争者,从边缘对象中提取数字,并根据该比较结果进行比较。所以这应该起作用,或者我完全误解了这个数据结构如何工作的整个概念?

+0

要获得排序的布局,您应该使用 'while(!tja.isEmpty()){ System.out.println(tja.poll()); }' – serhii 2015-07-02 21:51:20

回答

16

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

+0

那么,有没有可能打印优先队列? – 2014-05-26 20:18:55

+0

没关系,没有办法这么做......如果你让我,我会更新答案。 – 2014-05-26 20:23:25

6

我对Java中的PriorityQueue没有任何经验,但它看起来好像没有整合到iterator()toString()(它使用iterator())。

如果你这样做:

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

你得到正确的结果。

+0

完美,所以在运行删除之前,结构没有正确排序。 – Algific 2009-11-25 09:03:38

+1

不,结构总是正确排序,而不是当你迭代它时。但是,如果您调用poll(),或者peek()或remove(),则会按正确的顺序获取元素。 – omerkudat 2009-11-25 09:06:04

+0

@data_hepp否。删除不会对结构进行排序。结构已经排序,但它内部使用的toString()或iterator()并不能保证遍历的顺序。 – Varun 2009-11-25 09:06:54

1

您是否熟悉Binary堆的功能?如果不是,请通过最小堆和最大堆结构。 PriorityQueue在堆上实施。 PriorityQueue不会按递增顺序对项目进行排序,但会对其进行堆排序。

经过链接:Priority Queue

你得到的输出是正确的。