Java优先级队列oder

时间:2015-04-27 18:22:10

标签: java

import java.util.Comparator; import java.util.PriorityQueue;

public class minMaxHeap {

    static class PQsort implements Comparator<Integer> {

        public int compare(Integer one, Integer two) {
            return two - one;
        }
    }

    public static void main(String[] args) {
        int[] ia = { 1, 10, 5, 3, 4, 7, 6, 9, 8 };
        PriorityQueue<Integer> pq1 = new PriorityQueue<Integer>();

        // use offer() method to add elements to the PriorityQueue pq1
        for (int x : ia) {
            pq1.offer(x);
        }
        for(int num : pq1){
            System.out.print(" " + num);
        }
        System.out.println("");

        PQsort pqs = new PQsort();
        PriorityQueue<Integer> pq2 = new PriorityQueue<Integer>(10, pqs);
        // In this particular case, we can simply use Collections.reverseOrder()
        // instead of self-defined comparator
        for (int x : ia) {
            pq2.offer(x);
        }

        for(int num : pq2){
            System.out.print(" " + num);
        }



    }

}

我有这样的代码。 在java中,我使用优先级队列来存储值数组。 当我尝试逐个打印时,我希望看到它们按顺序打印。如:1 3 4 5 6 7 8 9。 但为什么我会看到&#34; 1 3 5 8 4 7 6 10 9&#34;?

当我通过给另一个比较器使用reverseOrder时。 结果也很奇怪,这是 &#34; 10 9 7 8 4 5 1 4&#34; 那是为什么?

由于

1 个答案:

答案 0 :(得分:2)

PriorityQueue不是已排序集合的替代品!它只是保证,元素的重复出列(通过poll())会根据它们的优先级删除它们,但在内部,元素不需要以完全排序的顺序存储。

PriorityQueue的JavaDoc:

  

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

PriorityQueue#iterator()的JavaDoc:

  

返回此队列中元素的迭代器。迭代器的确如此   不按任何特定顺序返回元素。

阅读文档通常不会受到伤害!