Queue not ordering naturally [duplicate]

2019-02-25 11:50发布

问题:

Possible Duplicate:
Why is this strange order happens in PriorityQueue in java?

Please, see the code below:

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() + " ");
}

Can someone explain me why the output is

airplane car bicycle

instead of

airplane bicycle car

?

Since in the API it says that the elements of the priority queue are ordered according to their natural ordering.

回答1:

PriorityQueue is based on a priority heap. This data structure allows to retrieve the least element very quickly though the elements are not sorted. Adding elements to PriorityQueue is faster than to TreeSet which is tree based. Since the elements are not sorted, the iterator, as API says, "does not return the elements in any particular order".



回答2:

According to the javadoc for the iterator:

The iterator does not return the elements in any particular order.

However, the first item (head) is guaranteed to be the smallest. So this should print what you expect:

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);
    }
}

If you want iteration to be sorted, you need to use a different structure, for example a TreeSet if you don't have duplicates.