PriorityQueue的顺序错误

张天禹*_*张天禹 3 java priority-queue

我在Java 8,Intellij Idea中遇到一个关于PriorityQueue顺序的问题,当我在队列中添加第三个数字时,顺序是错误的,但是只有第三个有此问题,这是我的代码。

import java.util.*;

public class vector {
    static Queue<Integer> q=new PriorityQueue<Integer>();
    public static void addNum(int num) {
        q.add(num);
    }
    public static void main(String args[]) {
        addNum(-1);
        addNum(-2);
        addNum(-3);
        addNum(-4);
        addNum(-5);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试调试代码,在addNum(-3)之后,队列为-3,-1,-2,但是在addNum(-4)之后,队列为-4,-3,-2,-1。

Tim*_*sen 5

似乎for的约定PriorityQueue不一定保证迭代顺序,而是保证从优先级队列中删除的每个元素都将遵循队列类型的自然顺序或自定义比较器的顺序(如果提供)。

Javadoc中你所看到的评论:

队列通常但不一定以FIFO(先进先出)的方式对元素进行排序。例外情况包括优先级队列(根据提供的比较器对元素进行排序或元素的自然排序)和LIFO队列(或堆栈),对LIFO进行排序(后进先出)。

Java似乎对优先级队列强制执行的约定是,从队列中删除的第一个元素将遵循队列中对象的自然顺序,或者应使用自定义比较器(如果提供)。

如果我们添加到当前脚本中以删除添加的五个元素,我们将看到返回的项将按从小到大的顺序排列:

public static void main(String args[]) {
    addNum(-1);
    addNum(-2);
    addNum(-3);
    addNum(-4);
    addNum(-5);

    // now remove all elements
    while (!q.isEmpty()) {
        System.out.println(q.remove());
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

-5
-4
-3
-2
-1
Run Code Online (Sandbox Code Playgroud)

如果您需要一个保持排序顺序的集合,请考虑使用TreeSet。或者,您可以使用常规ArrayListCollections.sort()如果要强加一定顺序,则可以调用。