【问题标题】:Why priorityQueue is not sorting the elements [duplicate]为什么priorityQueue不对元素进行排序[重复]
【发布时间】:2019-11-06 06:26:28
【问题描述】:

我有以下代码

        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。

【问题讨论】:

    标签: java collections queue priority-queue


    【解决方案1】:

    当您像这样打印PriorityQueue 时 - 来自AbstractCollectiontoString 方法在下面被调用。它使用扩展集合的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'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多