【发布时间】:2013-07-15 07:42:06
【问题描述】:
我无法理解 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
即使我将其转换为数组,订单也会丢失。
我感觉不到这甚至是字符串的自然排序。
有什么办法可以保持优先队列的插入顺序?
他们的排序依据是什么?
【问题讨论】:
-
其实就是字符串的自然排序。
-
请阅读JavaDocs:“方法
iterator()中提供的迭代器不保证遍历优先队列的元素以任何特定的顺序。” docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html -
PriorityQueue中提供排序的唯一方法是poll()和peek(),您没有使用其中任何一个。在我看来,您想要一个 FIFO 队列,而不是PriorityQueue。 -
先进先出队列:
LinkedList或ArrayDeque。 -
poll()和peek()根据类的Comparable.compareTo()实现或您提供的Comparator维护排序。这些都在 Javadoc 中。你读过吗?
标签: java collections queue priority-queue