Java中的priorityQueue顺序?

时间:2013-07-16 22:40:45

标签: java collections queue priority-queue

我无法理解Java中PriorityQueue的顺序。据我所知,他们是基于堆的,他们不能提供精确的迭代顺序作为插入顺序。我想知道然后在什么基础上priorityQueue自己排序。 给定代码:

PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.offer("hepqo");
        pq.offer("bro");
        pq.offer("wassup");
        pq.offer("okay");
        pq.offer("bingo");
        pq.offer("first");
        pq.offer("last");
        pq.offer("ssup");
        System.out.println("polled "+pq.poll());
        System.out.println(pq);
        String str[] = pq.toArray(new String[0]);
        Arrays.sort(str);
        for(String str1:str){
            System.out.println(str1);
        }

产生输出:

polledbingo
[bro, hepqo, first, okay, ssup, wassup, last]
bro
first
hepqo
last
okay
ssup
wassup

即使我将其转换为数组,订单也会丢失。 我无法感觉到这甚至是字符串的自然订购。
有没有办法维护优先级队列的插入顺序?
他们在什么基础上排序?

2 个答案:

答案 0 :(得分:3)

队列根据字符串的字典顺序进行排序,这是它们的自然顺序(即'b'先于'f','f'先于'h'等)。如果您希望队列维持广告订单顺序,请使用香草Queue代替PriorityQueue

答案 1 :(得分:-1)

Java中的优先级队列是所谓的Heap(一种抽象数据结构)的实现。如果您查看堆数据结构,则密钥(或Java术语中的集合元素)之间没有严格的排序原则。堆ADT主要用于快速插入/删除和第一个元素的O(K)时间检索(在堆的情况下将是根)。因此,不要在Java中使用PriorityQueue数据结构来搜索所有元素,排序元素或遍历元素。因为它不适合这些目的。 javadoc明确指出Collection和Iterable接口中的可选实现不是可依赖的东西(即,Iterator返回一个不保证顺序的实现,而像remove()这样的Collection方法包含()采取线性时间)