我不能理解PriorityQueue在Java中的顺序。据我所知,它们是基于堆的,它们不能提供确切的迭代顺序作为插入顺序。我想知道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即使当我将其转换为Array时,顺序也会丢失。
我甚至感觉不到这是字符串的自然排序。
有没有办法保持优先级队列的插入顺序?
他们是根据什么进行排序的?
发布于 2013-07-17 06:42:33
队列按照字符串的字典顺序排序,这是它们的自然顺序(即'b‘在'f’之前,'f‘在'h’之前,依此类推。如果希望队列保持插入顺序,则使用普通的Queue而不是PriorityQueue
发布于 2014-12-02 05:52:31
Java中的优先级队列是所谓的Heap (一种抽象数据结构)的实现。如果您查看Heap数据结构,就会发现在键(或Java术语中的集合元素)之间没有严格的排序原则。堆ADT主要用于快速插入/删除和O(K)时间检索第一个元素(在堆的情况下将是根元素)。因此,在Java语言中,不要使用PriorityQueue数据结构来搜索所有元素、排序元素或遍历元素。因为它不是为这些目的而设计的。javadoc清楚地指出,来自Collection和Iterable接口的可选实现不是可依赖的(即,Iterator返回一个不保证顺序的实现,而Collection方法,如remove(),contains()需要线性时间)
https://stackoverflow.com/questions/17688180
复制相似问题