在Java中对优先级队列进行排序

app*_*ice 15 java priority-queue

我试图插入整数PriorityQueue,我知道:

如果在PriorityQueue构造a时未指定比较器,则使用存储在队列中的数据类型的默认比较器.默认比较器将按升序对队列进行排序

但是,我得到的输出不是按排序顺序.运行以下代码后的输出是:[2, 4, 8, 6]

public static void main(String args[]) {
    PriorityQueue<Integer> q = new PriorityQueue<Integer>(10);
    q.offer(4);
    q.offer(2);
    q.offer(8);
    q.offer(6);

    System.out.print(q);
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下原因吗?

Eri*_*aas 29

一个PriorityQueue的是所谓的二元堆.它只是在第一个元素最少的意义上排序/排序.换句话说,它只关心队列前面的内容,其余部分在需要时"排序".

元素仅在它们出列时排序,即使用从队列中删除poll().这就是为什么PriorityQueue能够获得如此优异的性能的原因,因为它不会在任何时候进行任何排序.

如果你想知道堆是如何工作的,我推荐麻省理工学院关于堆的讲座.


Flo*_*yle 7

当你打电话System.out.print()给你时PriorityQueue,它不是poll()你的元素,而是打电话toString().PriorityQueue没有实现toString(),所以它是toString()AbstractCollection将被称为:

public String toString() {
    Iterator<E> i = iterator();
if (! i.hasNext())
    return "[]";

StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
    E e = i.next();
    sb.append(e == this ? "(this Collection)" : e);
    if (! i.hasNext())
    return sb.append(']').toString();
    sb.append(", ");
}
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此方法仅迭代PriorityQueue.正如您在PriorityQueuejavadoc中看到的:

方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素.如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray()).

如果你想使用PriorityQueue它的意图,你需要poll()每个值并打印它:

while (!q.isEmpty()) {
    Integer i = q.poll();
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

输出:

2
4
6
8
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

41447 次

最近记录:

11 年,8 月 前