Java 不自然排队

Java 不自然排队,java,queue,priority-queue,Java,Queue,Priority Queue,可能重复: 请参阅下面的代码: 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.has

可能重复:

请参阅下面的代码:

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 bicycle car
?

因为它表示优先级队列的元素是根据其自然顺序排序的。

根据:

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

但是,第一项(头)保证是最小的。因此,这应该打印您期望的内容:

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);
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
队列q=新的优先级队列();
q、 要约(“汽车”);
q、 要约(“飞机”);
q、 要约(“自行车”);
字符串e=null;
而((e=q.poll())!=null){
系统输出打印ln(e);
}
}

如果希望对迭代进行排序,则需要使用不同的结构,例如,如果没有重复项,则需要使用
树集。

优先级队列基于优先级堆。此数据结构允许快速检索最小的元素,尽管这些元素没有排序。将元素添加到PriorityQueue比添加到基于树的TreeSet要快。由于元素没有排序,正如API所说,迭代器“不会以任何特定顺序返回元素”。

@Lang它可能不是随机的-我还没有查看实现,但插入新项时可能会发生的情况是,它比头小,并且会先插入,如果不是,则会先插入,它被放在尾巴上。这可以解释你看到的顺序。但是为什么我总是得到相同的随机顺序?迭代器出现问题。(很抱歉,我的问题在您的回答后结束)刚刚发现:
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);
    }
}