PriorityQueue没有正确排序其内容?

时间:2013-11-06 01:08:56

标签: java

Java Doc说: 使用默认初始容量(11)创建PriorityQueue,该容量根据其自然顺序对其元素进行排序。

但是当我写这样的测试时:

public class Test {

    public static void main (String a[]) {
        Queue<Integer> queue = new PriorityQueue<Integer>();

        for (int i = 1; i <= 20; i++) {
            queue.offer(i);
        }

        System.out.println(queue);

        Queue<Integer> queue2 = new PriorityQueue<Integer>();

        for (int i = 20; i >= 1; i--) {
            queue2.offer(i);
        }

        System.out.println(queue2);
    }
}

我得到了以下输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[1, 2, 7, 4, 3, 10, 8, 11, 5, 12, 13, 19, 15, 16, 9, 20, 14, 17, 6, 18]

Seenm喜欢两个具有相同内容的队列,他们的内容没有获得相同的顺序?

2 个答案:

答案 0 :(得分:6)

优先级队列不保证整套的排序;所有它保证最小元素在前面(或者最大,如果它是最大优先级队列)。

来自文档:

  

不保证方法iterator()中提供的迭代器   以任何特定顺序遍历优先级队列的元素。   如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。

可能添加一个小上下文:内部优先级队列的作用是将元素存储在对数高度的树结构中(无论如何使用树的敏感实现)。 insert和类似删除的操作旨在将最小元素保留在该树的根部,并使每个子树中的元素保持大于父顶点的元素(这就是使它们成为堆的元素,该属性是称为堆属性)。它并不保证对兄弟姐妹的子元素进行任何排序,例如我们从排序树中知道它。堆属性和对数高度是优先队列的快速操作运行时间,但它带来的缺点是你只能快速获得一个元素,而这是最小的元素(或最大堆的最大值)。 / p>

答案 1 :(得分:0)

PriorityQueue.toString使用iterator(),它不保证以任何特定顺序遍历优先级队列的元素(来自API)。试试

    while(!queue.isEmpty()) {
            System.out.print(queue.poll() + ",");
    }