有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么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"));

系统。出来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之前。 编辑:我正在使用Java8


共 (1) 个答案

  1. # 1 楼答案

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

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

    如果您想按比较器定义的优先级顺序检索元素,请使用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'}