import java.util.Comparator; import java.util.PriorityQueue;
public class minMaxHeap {
static class PQsort implements Comparator<Integer> {
public int compare(Integer one, Integer two) {
return two - one;
}
}
public static void main(String[] args) {
int[] ia = { 1, 10, 5, 3, 4, 7, 6, 9, 8 };
PriorityQueue<Integer> pq1 = new PriorityQueue<Integer>();
// use offer() method to add elements to the PriorityQueue pq1
for (int x : ia) {
pq1.offer(x);
}
for(int num : pq1){
System.out.print(" " + num);
}
System.out.println("");
PQsort pqs = new PQsort();
PriorityQueue<Integer> pq2 = new PriorityQueue<Integer>(10, pqs);
// In this particular case, we can simply use Collections.reverseOrder()
// instead of self-defined comparator
for (int x : ia) {
pq2.offer(x);
}
for(int num : pq2){
System.out.print(" " + num);
}
}
}
我有这样的代码。 在java中,我使用优先级队列来存储值数组。 当我尝试逐个打印时,我希望看到它们按顺序打印。如:1 3 4 5 6 7 8 9。 但为什么我会看到&#34; 1 3 5 8 4 7 6 10 9&#34;?
当我通过给另一个比较器使用reverseOrder时。 结果也很奇怪,这是 &#34; 10 9 7 8 4 5 1 4&#34; 那是为什么?
由于
答案 0 :(得分:2)
PriorityQueue
不是已排序集合的替代品!它只是保证,元素的重复出列(通过poll()
)会根据它们的优先级删除它们,但在内部,元素不需要以完全排序的顺序存储。
PriorityQueue
的JavaDoc:
不保证方法iterator()中提供的迭代器 以任何特定顺序遍历优先级队列的元素。 如果您需要有序遍历,请考虑使用
Arrays.sort(pq.toArray())
。
PriorityQueue#iterator()
的JavaDoc:
返回此队列中元素的迭代器。迭代器的确如此 不按任何特定顺序返回元素。
阅读文档通常不会受到伤害!