Java PriorityQueue 和比较器排序不正确

标签 java priority-queue

我是 Java 新手,正在尝试使用自定义比较器实现优先级队列。我想将句子放入队列中并删除它们以获得最高分。

对于比较器类,我有:

public class SentenceScoreComparator implements Comparator<Sentence> {

@Override
public int compare(Sentence o1, Sentence o2) {
    if (o2.getScore() > o1.getScore()) return -1;
//fixed typo
    if (o2.getScore()  < o1.getScore()) return 1;
    return 0;
}

}

然后我打印出这样的句子:

PriorityQueue<Sentence> allSentences = new PriorityQueue<Sentence>(new SentenceScoreComparator());
//add sentences

for(Sentence s :allSentences){
            System.out.println(s.getScore()); 
        }

但它们不按顺序排列

0.34432960587450223
0.47885099912108975
0.10991840331015199
0.36222267254836954
0.05164923572003221
0.5366117828694823
0.3891453014131773
0.0961512261934429
0.5566040852233918
0.5079687049927742
0.7628021620154812
0.6023121606121791
0.25695632228681914
0.15701049878801304
0.1260031244674359
0.36516025683986736
0.3846995962155155

我检查了队列是否正在使用具有正确比较器方法的比较器。有人可以解释一下我缺少什么吗?

最佳答案

第二个 if 中的比较器中有一个拼写错误,其中 o2 分数与自身进行比较。

替换为:

@Override
public int compare(Sentence o1, Sentence o2) {
    return Double.compare(o1.getScore(), o2.getScore());
}

最重要的是,正如 bradimus 回答的那样,PriorityQueue 不保证任何排序遍历。使用常规列表并对其进行排序。

关于Java PriorityQueue 和比较器排序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187631/

相关文章:

java - 如何获取 DLL 或 EXE 的文件描述

java - 在没有父类主体的情况下用 Java 编译插件代码

java - 客户端(java standalone client)应用认证和用户认证的区别

c++ - 模板化优先级队列导致对象成为指针。由 小码哥发布于

C++ STL : Using map with priority_queue

java - Quickblox 自定义对象推送到包含 : ' , ' or ' " ' 的数组字符串

java - 在 Canvas 中绘制不同颜色的线条

java - Java中PriorityQueue类的加法操作

c++ - 同一类中的多个 Operator() 重载

c++ - 解释一下默认的priority_queue::top()的行为?