2016-03-23 6 views
0

私はJavaを初めて使用しており、カスタムコンパレータを使用して優先度キューを実装しようとしています。私は文章をキューに入れて、最高スコアになるように削除しておきたい。Java PriorityQueueとコンパレータが正しく注文されない

私が持っているコンパレータクラスの

:私はそのようにのような文章をプリントアウト

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 

ではありませんキューは正しいコンパレータ方式でコンパレータを使用しています。誰かが私が逃していることを説明することができます

答えて

3

2番目のifのコンパレータでタイプミスがあり、o2のスコアがそれ自身と比較されます。 、その上で

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

bradimusは答えとして、PriorityQueueは任意のソートされたトラバーサルを保証するものではありません。

はに交換してください。定期的なリストを使ってそれをソートしてください。

+0

ありがとうございました。どのように私はそれを逃したのか分からない –

3

PriorityQueueを順番にトラバースすることは決してありません。 javadocsから:

このクラスとその反復子は、CollectionとIteratorインターフェイスのすべてのオプションメソッドを実装しています。 iterator()メソッドで提供されるIteratorは、特定の順序で優先順位キューの要素をトラバースすることは保証されていません。オーダートラバーサルが必要な場合は、Arrays.sort(pq.toArray())の使用を検討してください。

関連する問題