队列没有自然排序

时间:2012-12-02 11:10:51

标签: java queue priority-queue

  

可能重复:
  Why is this strange order happens in PriorityQueue in java?

请参阅以下代码:

public static void main(String[] args) {
    Queue<String> q = new PriorityQueue<String>();
    q.offer("car");
    q.offer("airplane");
    q.offer("bicycle");
    Iterator<String> i = q.iterator();
    while(i.hasNext())
        System.out.print(i.next() + " ");
}

有人可以解释为什么输出

airplane car bicycle

而不是

airplane bicycle car

因为in the API它表示优先级队列的元素是按照它们的自然顺序排序的。

2 个答案:

答案 0 :(得分:8)

根据javadoc for the iterator

  

迭代器不会以任何特定顺序返回元素。

但是,第一项(头部)保证是最小的。所以这应该打印出你期望的东西:

public static void main(String[] args) throws Exception {
    Queue<String> q = new PriorityQueue<String>();
    q.offer("car");
    q.offer("airplane");
    q.offer("bicycle");
    String e = null;
    while ((e = q.poll()) != null) {
        System.out.println(e);
    }
}

如果要对迭代进行排序,则需要使用其他结构,例如TreeSet如果没有重复项。

答案 1 :(得分:1)

PriorityQueue基于优先级堆。尽管元素未排序,但此数据结构允许非常快速地检索最少元素。向PriorityQueue添加元素比基于树的TreeSet更快。由于元素没有排序,因此API所说的迭代器“不会以任何特定的顺序返回元素”。