Java PriorityQueue和Comparator未正确排序

时间:2016-03-23 20:01:21

标签: 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

我检查了队列正在使用比较器和正确的比较器方法。有人可以解释我错过的东西吗?

2 个答案:

答案 0 :(得分:3)

PriorityQueue从未承诺按顺序遍历它们。来自javadocs

  

此类及其迭代器实现Collection和Iterator接口的所有可选方法。方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。

答案 1 :(得分:3)

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

将其替换为:

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

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