java - 为什么priorityQueue不对元素进行排序

标签 java collections queue priority-queue

我有下面的代码

        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。

最佳答案

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

Returns an iterator over the elements in this queue. The iterator does not return the elements in any particular order.

如果您想按照比较器定义的优先级顺序检索元素,请使用 pollremove 等方法。考虑到您已经重写了 StudentDTO::toString 方法,类似这样的操作将从队列中打印对象,同时将它们从队列中删除:

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'}

关于java - 为什么priorityQueue不对元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58724232/

相关文章:

java - hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?

java - 为什么 Eclipse 给我 "groovy.lang.GroovyObject cannot be resolved"?

java - 如何对对象类型列表进行排序

java - 我应该如何正确地迭代优先级队列?

python - 在python中删除优先级队列的百分比

iphone - 在 iOS 4 (iPhone) 上使用 NSInitationOperation (NSOperation) 和 NSOperationQueue 会导致速度显着下降

java - TimerTask 类在 java 中只能运行一次

java - 如何使用 Google Spreadsheet API 将一个单元格的样式复制到另一个单元格中

c# - 将 List<DerivedClass> 转换为 List<BaseClass>

c# - 为什么这个类型转换不起作用?