5

我无法理解PriorityQueueJava 中的顺序。据我了解,它们是基于堆的,它们不能提供精确的迭代顺序作为插入顺序。我想知道然后根据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

即使我将其转换为数组,订单也会丢失。
我感觉不到这甚至是字符串的自然排序。
有什么办法可以保持优先队列的插入顺序吗?
他们是根据什么分类的?

4

2 回答 2

3

队列根据字符串的字典顺序排序,这是它们的自然顺序(即“b”在“f”之前,“f”在“h”之前,等等)。如果您希望队列保持插入顺序,请使用 vanillaQueue而不是PriorityQueue

于 2013-07-16T22:42:32.573 回答
-1

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

于 2014-12-01T21:52:30.803 回答