【问题标题】:How the priority will be given in PriorityQueue when some random elements are added?添加一些随机元素时,PriorityQueue 中的优先级如何分配?
【发布时间】:2021-02-24 14:09:02
【问题描述】:

当我在 PriorityQueue 中添加一些随机数时,当我打印 PriorityQueue 时,元素会以不同的顺序打印。

这是怎么回事?

例子

    PriorityQueue<Integer> s=new PriorityQueue<Integer>();
            s.add(22);
            s.add(212);
            s.add(423);
            s.add(323);
            s.add(1);
            System.out.print(s);

output:
    [1, 22, 423, 323, 212]

【问题讨论】:

    标签: java data-structures priority-queue


    【解决方案1】:

    它没有保证订单(https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html):

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

    通常您使用poll() 方法根据元素的自然顺序检索元素,例如:

     while (!pq.isEmpty()) {
         var element = pq.poll();
         ...
     }
    

    【讨论】:

      【解决方案2】:

      toString() 返回优先级队列内部存储的表示,而不是元素的逻辑顺序。 toArray() 和迭代也是如此:这些方法都不能保证元素将按其优先级顺序返回。

      如果要按优先级顺序获取元素,则需要单独poll()它们(从而销毁队列)。如果您想按特定顺序列出元素,PriorityQueue 因此不是一个合适的数据结构。 SortedSet 在这里更合适。相比之下,队列数据结构(其中PriorityQueue 是一种特殊情况)用于接收和检索一次元素,而不是用于检查静态数据。

      【讨论】:

        猜你喜欢
        • 2015-05-23
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 2011-07-24
        • 2020-08-09
        • 1970-01-01
        相关资源
        最近更新 更多