我有下面的代码
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.
如果您想按照比较器定义的优先级顺序检索元素,请使用 poll
和 remove
等方法。考虑到您已经重写了 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/