为什么PriorityQueue不对元素进行排序

我下面有一段代码

        Comparator<StudentDTO> compareNames = Comparator.comparing(StudentDTO::getName);
    PriorityQueue<StudentDTO> h = new PriorityQueue<>(compareNames);

    h.offer(new StudentDTO(5,"c"));
    h.offer(new StudentDTO(2,"b"));
    h.offer(new StudentDTO(8,"z"));
    h.offer(new StudentDTO(1,"a"));

System.out.println(h);

我得到的输出如下:

[StudentDTO [rollNo=1,Name=a],StudentDTO [rollNo=2,Name=b],StudentDTO [rollNo=8,Name=z],StudentDTO [rollNo=5,Name=c]]

不确定为什么Name = z在Name = c之前出现。 编辑:我正在使用Java 8。

zhuangmisi 回答:为什么PriorityQueue不对元素进行排序

当您像这样打印PriorityQueue时,将在下面调用toString中的AbstractCollection方法。并且它使用Iterator的扩展集合(在您为PriorityQueue的情况下)遍历集合并从中创建一个String。而且,如果您查看PriorityQueue::iterator的文档,它会返回迭代器,该迭代器以不特定的顺序返回元素:

  

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

如果要按比较器定义的优先级顺序检索元素,请使用pollremove之类的方法。考虑到您已覆盖StudentDTO::toString method,这样的操作会从队列中打印对象,也会将它们从队列中删除:

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

和输出:

StudentDTO{rollNo=1,name='a'}
StudentDTO{rollNo=2,name='b'}
StudentDTO{rollNo=5,name='c'}
StudentDTO{rollNo=8,name='z'}
本文链接:https://www.f2er.com/3154574.html

大家都在问