无法理解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);
}
}