无法理解PriorityQueue如何更改排序顺序? import java.util.*; abc班{ 公共静态void main(字符串参数[]){ PriorityQueue pq=新的PriorityQueue(); pq.增加(1); pq.增加(2); pq.增加(3); pq.增加(4); pq.增加(5); pq.增加(6); 系统输出打印项次(pq); pq.移除(); 系统输出打印项次(pq); } }

无法理解PriorityQueue如何更改排序顺序? import java.util.*; abc班{ 公共静态void main(字符串参数[]){ PriorityQueue pq=新的PriorityQueue(); pq.增加(1); pq.增加(2); pq.增加(3); pq.增加(4); pq.增加(5); pq.增加(6); 系统输出打印项次(pq); pq.移除(); 系统输出打印项次(pq); } },java,collections,Java,Collections,当我移除元素时,顺序会发生变化。 根据字典排序,输出应按升序排列。但我得到的结果是: 来自的toString()方法的文档(将队列传递给System.out.println()方法时会调用该方法): 字符串表示法由集合的 元素的迭代器返回顺序,[…] 从的iterator()方法的文档中: 返回此队列中元素的迭代器。迭代器执行此操作 不按任何特定顺序返回元素 您的答案就在这里。来自的toString()方法的文档(当您将队列传递到System.out.println()方法时会调用该方法): 字

当我移除元素时,顺序会发生变化。 根据字典排序,输出应按升序排列。但我得到的结果是:

来自的
toString()
方法的文档(将队列传递给
System.out.println()
方法时会调用该方法):

字符串表示法由集合的 元素的迭代器返回顺序,[…]

从的
iterator()
方法的文档中:

返回此队列中元素的迭代器。迭代器执行此操作 不按任何特定顺序返回元素

您的答案就在这里。

来自的
toString()
方法的文档(当您将队列传递到
System.out.println()方法时会调用该方法):

字符串表示法由集合的 元素的迭代器返回顺序,[…]

从的
iterator()
方法的文档中:

返回此队列中元素的迭代器。迭代器执行此操作 不按任何特定顺序返回元素


你的答案就在这里。

调用
System.out.println(pq)
与调用
System.out.println(pq.toString())相同

如果您查看,您将看到它指出:

返回此集合的字符串表示形式。弦 表示法包括集合中的元素列表 它们由其迭代器返回的顺序,用方括号括起来 ("[]"). 相邻元素由字符“,”(逗号)分隔 和空间)。元素被转换为字符串,如 String.valueOf(对象)

我强调了重要的部分。因此,我们需要查看以下内容:

返回此队列中元素的迭代器迭代器执行 不按任何特定顺序返回元素。

因此,代码的输出不允许对优先级队列施加的顺序得出任何结论

在报告中说:

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


调用
System.out.println(pq)
与调用
System.out.println(pq.toString())相同

如果您查看,您将看到它指出:

返回此集合的字符串表示形式。弦 表示法包括集合中的元素列表 它们由其迭代器返回的顺序,用方括号括起来 ("[]"). 相邻元素由字符“,”(逗号)分隔 和空间)。元素被转换为字符串,如 String.valueOf(对象)

我强调了重要的部分。因此,我们需要查看以下内容:

返回此队列中元素的迭代器迭代器执行 不按任何特定顺序返回元素。

因此,代码的输出不允许对优先级队列施加的顺序得出任何结论

在报告中说:

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


PriorityQueue
实现堆数据结构。此数据结构具有使元素保持部分排序的属性。Heap是一个二叉树(即使实际上它是在数组中实现的),它保持以下不变性:如果节点P有一个子C,则P的值小于/大于C的值

因此,只有第一个元素(根)保证是集合的最小值/最大值,而所有其他值仅部分排序


为什么这样做?好的,如果您必须保留一个完整的排序集合,那么插入/删除操作将采用
O(n)
,而对于堆数据结构,它们都是
O(logn)
。如果您只对集合的最大/最小值感兴趣,那么
PriorityQueue
比完整的排序数组具有显著的优势

PriorityQueue
实现堆数据结构。此数据结构具有使元素保持部分排序的属性。Heap是一个二叉树(即使实际上它是在数组中实现的),它保持以下不变性:如果节点P有一个子C,则P的值小于/大于C的值

因此,只有第一个元素(根)保证是集合的最小值/最大值,而所有其他值仅部分排序

为什么这样做?好的,如果您必须保留一个完整的排序集合,那么插入/删除操作将采用
O(n)
,而对于堆数据结构,它们都是
O(logn)
。如果您只对集合的最大/最小值感兴趣,那么
PriorityQueue
比完整的排序数组具有显著的优势

import java.util.*;
class abc {

    public static void main(String args[]){

        PriorityQueue<Integer> pq = new PriorityQueue<Integer>();

        pq.add(1);
        pq.add(2);
        pq.add(3);
        pq.add(4);
        pq.add(5);
        pq.add(6);

        System.out.println(pq);
        pq.remove();
        System.out.println(pq);     
    }           
}