【问题标题】:Why does toString of PriorityQueue returns elements out of order?为什么 PriorityQueue 的 toString 会乱序返回元素?
【发布时间】:2021-04-26 10:22:59
【问题描述】:

我有这个使用 PriorityQueue 的简单代码,我希望整数按降序存储。

PriorityQueue<Integer> jumps = new PriorityQueue<>(20,Collections.reverseOrder());
jumps.add(8);
jumps.add(5);
jumps.add(15);
jumps.add(2);
jumps.add(16);
System.out.println(jumps.toString());

打印出来

[16, 15, 8, 2, 5]

虽然我已经预料到了

[16, 15, 8, 5, 2]

我在这里做错了什么?

【问题讨论】:

    标签: java priority-queue


    【解决方案1】:

    PriorityQueueIterator 返回的顺序是not guaranteed(强调他们的):

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

    这是what toString() uses,因此toString()输出中元素的顺序也没有指定

    保证的是多次调用poll() 将按适当的顺序返回值:

    while (!jumps.isEmpty()) {
      System.out.println(jumps.poll());
    }
    

    【讨论】:

    • 好的,所以 PriorityQueue 的行为符合预期。只是 toString 调用了不保证顺序的迭代器。谢谢!
    • @rajeshnair 您想在每次调用poll() 后观察toString() 的输出,并查看其实现。
    • @MarkRotteveel ,我已经广泛使用了 PriorityQueue 并且知道实现。当我看到这个输出时,我很困惑。我应该在发布问题之前进行更多探索
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2020-04-13
    • 2017-12-26
    相关资源
    最近更新 更多