2017-01-23 60 views
2

我正在使用優先級隊列根據cgpa(這是一個double值)對學生列表進行排序。如果我把它作爲整數比它工作正常,或者如果我添加一個字段名稱作爲字符串和基於字符串排序,那麼它也可以正常工作。雙數據類型沒有在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進行排序。您可以使用輪詢方法。 (!studentList.isEmpty()) System.out.println(studentList.poll()。getCgpa()); –

+0

感謝您的建議。而不是每個我輪詢優先隊列的數據,它的工作。我想糾正的一件事是我無法使用Arrays.sort()對數組排序,因爲我的學生類沒有實現可比較的接口,所以我將得到一個異常並且優先級隊列已經對數據進行了排序。 – Ishan

+0

@Ishan輪詢在這裏看起來像是一個非常聰明的選項,前提是您可以從隊列中移除元素。如果您想保持隊列完好無損,這將不是一種選擇。 –