首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >priorityQueue在Java中的顺序?

问priorityQueue在Java中的顺序?
EN

Stack Overflow用户
提问于 2013-07-17 06:40:45
回答 2查看 13.6K关注 0票数 5

我不能理解PriorityQueue在Java中的顺序。据我所知,它们是基于堆的,它们不能提供确切的迭代顺序作为插入顺序。我想知道priorityQueue是根据什么对自己进行排序的。给定代码:

代码语言:javascript
复制
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);
        }

生成输出:

代码语言:javascript
复制
polledbingo
[bro, hepqo, first, okay, ssup, wassup, last]
bro
first
hepqo
last
okay
ssup
wassup

即使当我将其转换为Array时,顺序也会丢失。

我甚至感觉不到这是字符串的自然排序。

有没有办法保持优先级队列的插入顺序?

他们是根据什么进行排序的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-17 06:42:33

队列按照字符串的字典顺序排序,这是它们的自然顺序(即'b‘在'f’之前,'f‘在'h’之前,依此类推。如果希望队列保持插入顺序,则使用普通的Queue而不是PriorityQueue

票数 3
EN

Stack Overflow用户

发布于 2014-12-02 05:52:31

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17688180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档