Java中PriorityQueue中的奇怪排序

时间:2012-06-10 21:21:21

标签: java collections priority-queue

我正在尝试使用优先级队列来保持整数的有序列表。在这样一个简单的例子中:

PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.offer(3000);
queue.offer(1999);
queue.offer(999);
for(Integer i : queue)
    System.out.println(i);

打印

999
3000
1999

这不是我期待的考虑自然的讽刺。

我只想迭代而不通过排序删除或添加队列(用作排序列表)和排序。我还能以简单的方式做到这一点吗?

2 个答案:

答案 0 :(得分:7)

PriorityQueue是一个优化的集合,用于快速查找尾部或头部值,使用称为堆的部分有序树结构(在维基百科上查找)。如果您弹出元素,它们将被订购。如果要迭代,请使用例如SortedSet,它也存储已排序的元素。

答案 1 :(得分:4)

这是PriorityQueue的一个非常棘手的问题:引用the Api

  

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

使用轮询代替获取将按顺序排列的头部