我不理解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
即使我将它转换为数组,顺序也会丢失。
我感觉这甚至不是字符串的自然排序。
有没有办法维护优先队列的插入顺序?
它们基于什么排序?
iterator()
中提供的迭代器不能保证以任何特定顺序遍历优先级队列的元素。”http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html - Matt BallPriorityQueue
中提供排序的唯一方法是poll()
和peek()
,而您都没有使用它们。在我看来,您想要的是一个 FIFO 队列,根本不需要PriorityQueue
。 - user207421LinkedList
或ArrayDeque
。 - Louis Wassermanpoll()
和peek()
根据类的Comparable.compareTo()
实现或您提供的Comparator
维护排序。这些都在Javadoc中有说明。您已经阅读过了吗? - user207421