2016-12-14 63 views
3

我在嘗試使用比較器接口以降序對列表進行排序。但是這些值不是按降序排列的。不知道我在這裏做錯了什麼。java - 使用比較器以降序排序

public class Student { 

    int rollNo; 
    String name; 
    int age; 

    public Student(int RollNo, String Name, int Age){ 
     this.rollNo = RollNo; 
     this.name = Name; 
     this.age = Age; 
    } 
} 

public class AgeComparator implements Comparator<Student>{ 

    @Override 
    public int compare(Student o1, Student o2) { 
     return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0); //Ascending 

     //return o1.age < o2.age ? -1 :(o1.age > o2.age ? 1 : 0); // Descending 
    } 

} 

public class Comparator_Sort { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     ArrayList<Student> al = new ArrayList<Student>(); 
     al.add(new Student(5978,"Vishnu", 50)); 
     al.add(new Student(5979,"Vasanth", 30)); 
     al.add(new Student(5980,"Santhosh", 40)); 
     al.add(new Student(5981,"Santhosh", 20)); 
     al.add(new Student(5982,"Santhosh", 10)); 
     al.add(new Student(5983,"Santhosh", 5)); 


     Collections.sort(al, new AgeComparator()); 

     for(Student s : al){ 
      System.out.println(s.rollNo+" "+s.name+" "+s.age); 
     } 

    } 

} 

我可以按升序排序列表,而我無法做到這一點的降序

return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0); //Sorted in Ascending 
return o1.age < o2.age ? -1 :(o1.age > o2.age ? 1 : 0); // Not sorted in Descending 

比較文檔 - 返回:負整數,零或者作爲第一個參數的正整數小於,等於或大於第二個參數。來源是從here

誰能告訴我爲什麼降序排序不工作?

回答

7

您的兩個三元條件運算符產生相同的結果(因爲你有1交換雙方><-1):

return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0); //Sorted in Ascending 
return o1.age < o2.age ? -1 :(o1.age > o2.age ? 1 : 0); // Not sorted in Descending 

降序排序,你需要:

return o1.age > o2.age ? -1 :(o1.age < o2.age ? 1 : 0); 
+0

如果ü校驗i所提供的源,它遵循以下標準 – Aishu

+0

-1:O1 O2 – Aishu

+0

我按照相同的方法,但按降序排序不起作用 – Aishu

0

那麼你應該要麼寫爲:

return o1.age < o2.age ? 1 :(o1.age > o2.age ? -1 : 0); 

或寫爲:

return o1.age > o2.age ? -1 :(o1.age < o2.age ? 1 : 0); 

您當前試圖將仍然按升序排序。

5

@Eran已經指出了比較器中的錯誤。

我想補充一點,你可能只是返回o1.age - o2.age。比較結果不一定是-11對於<>它可能只是負面或正面。

你也可以叫Comparator.reversed。或者Comparator.comparing(Student::getAge).reversed()

0
return o1.age > o2.age ? -1 :(o1.age < o2.age ? 1 : 0); 

雖然降序只是將您的升序返回語句乘以-1。像這樣

-1*(return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0)) 
0

濫用三元條件很容易出錯,因爲不可讀。

爲什麼不簡單地寫經典的if-else-if爲降序比較?

public class AgeComparatorDesc implements Comparator<Student> { 

    @Override 
    public int compare(Student o1, Student o2) { 
    if (o1.age > o2.age) { 
     return -1; 
    } else if (o1.age < o2.age) { 
     return 1; 
    }  
    return 0; 
    } 

} 
1

您可以直接使用比較器類實例。以下是代碼示例。

假設你爲學生定義了一個getter方法"getAge()"

Comparator<Student> m_studentComparator = new Comparator<Sudent>() { 
     @Override 
     public int compare(Student lhs, Student rhs) { 
      return rhs.getAge().compareTo(lhs.getAge()); // Descending order 
     } 
    }; 

Collections.sort(<<Your list>> , m_studentComparator); // this would return the descending order list. 

如果你想要一個升序列表中,只是改變了return語句在重寫的方法

return lhs.getAge().compareTo(rjs.getAge()); // Ascending order. 

希望這回答了你的問題。