2017-01-23 11 views
2

私は優先度キューを使用してdouble値のcgpaに基づいて生徒のリストをソートしています。私はそれが正常に動作しているよりも整数としてそれを作っている場合、または私は文字列としてフィールド名を追加し、文字列の基礎で並べ替える場合、それはうまく動作します。ダブルデータ型がJavaの優先度キューで正しくソートされない

public class MainClass { 


    public static void main(String[] args) { 

    // comparator class to sort the student on basis of cgpa. 
     Comparator<Student> studentComparator = new Comparator<Student>() { 
      @Override 
      public int compare(Student s1, Student s2) { 
       if (s1.getCgpa() < s2.getCgpa()) 
        return 1; 
       else if (s1.getCgpa() > s2.getCgpa()) 
        return -1; 
       else 
        return 0; 
      } 
     }; 

     Scanner in = new Scanner(System.in); 
     int totalEvents = 8; 
     PriorityQueue<Student> studentList = new PriorityQueue<>(totalEvents, studentComparator); 
     // adding value in to priority queue by taking input from user in cmd 
     while(totalEvents>0) { 
      double cgpa = in.nextDouble(); 
      Student student = new Student(cgpa); 
      studentList.add(student); 
      totalEvents--; 
     } 

     for (Student s : studentList) { 
      System.out.println(s.getCgpa()); 
     } 
    } 
    } 

ここは私のモデルクラスです。ここで

class Student { 

    private double cgpa; 

    public Student(double cgpa) { 
     super(); 
     this.cgpa = cgpa; 
    } 

    public double getCgpa() { 
     return cgpa; 
    } 

} 

私の入力

3.75 
3.8 
3.7 
3.85 
3.9 
3.6 
3.95 
3.95 

、ここでは、出力

3.95 
3.95 
3.9 
3.85 
3.8 
3.6 
3.7 
3.75 

です私はstrictfpのキーワードを試してみましたが、ダブルラッパークラスを使用しようとしましたが、それでも同じ問題。

答えて

7

コードは見栄えが良く、優先度キューを繰り返し処理するコードでも正しいですが、順序付けされたトラバーサルを与えるわけではありません。その理由は、PriorityQueueの内部動作は、イテレータが特定の順序を保証できないようなものであるためです。 Javadoc for PriorityQueueで説明として

:メソッド・イテレータに設け

イテレータ()は、任意の特定の順序で優先度キューの要素を横断することが保証されません。オーダートラバーサルが必要な場合は、Arrays.sort(pq.toArray())の使用を検討してください。

使用Arrays.sort(studentList.toArray())

Student[] students = Arrays.sort(studentList.toArray()); 

for (Student s : students) { 
    System.out.println(s.getCgpa()); 
} 
+3

上記の回答に同意します。 しかし、PriorityQueueをソートする理由はないと付け加えたいと思います。 pollメソッドを使用できます。 while(!studentList.isEmpty()) System.out.println(studentList.poll()。getCgpa()); –

+0

提案していただきありがとうございます。それぞれの代わりに私は優先順位のキューからデータをポーリングし、それは働いた。私が訂正したいのは、Arrays.sort()を使って配列をソートすることができないということです。学生クラスが同等のインターフェースを実装していないので、例外が発生し、優先順位キューはすでにデータをソートしています。 – Ishan

+0

@Ishan Pollingはキューから要素を削除しても問題ありません。キューをそのままの状態にしたい場合は、オプションではありません。 –

関連する問題