[英]Sorting a List in descending order using reverseOrder() with custom Comparator?
[英]Sorting in Descending order using Comparator
我正在嘗試使用比較器接口按降序對列表進行排序。 但是這些值不是按降序排序的。 不知道我在這里做錯了什么。
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
比較器文檔——返回:負整數、零或正整數,因為第一個參數小於、等於或大於第二個參數。 來源是從這里找到的
誰能告訴我為什么降序排序不起作用?
您的兩個三元條件運算符產生相同的結果(因為您將>
與<
和-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);
@Eran 已經指出了比較器中的錯誤。
我想補充一點,您可以只返回o1.age - o2.age
。 對於<
或>
,比較的結果不必正好是-1
或1
,它可能只是負數或正數。
你也可以調用Comparator.reversed
。 或Comparator.comparing(Student::getAge).reversed()
。
濫用三元條件容易出錯,因為不可讀。
為什么不簡單地為降序比較器編寫經典的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;
}
}
您可以直接使用比較器類實例。 下面是代碼示例。
假設您為學生定義了一個 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.
希望這能回答你的問題。
年齡值是一個整數,看起來總是正數,可以使用這個縮短代碼。
return o1.age - o2.age; // Ascending
return o2.age - o1.age; // Descending
此代碼不能用於負值。
例如,
如果o1.age = 10
, o2.age = 11
,此代碼將返回-1
升序和1
降序,這是正確的。
但是在o1.age = -10
, o2.age = -11
的情況下,此代碼將返回1
升序和-1
降序,這是不正確的。
那么你應該把它寫成:
return o1.age < o2.age ? 1 :(o1.age > o2.age ? -1 : 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);
盡管對於降序,只需將升序返回語句乘以 -1。 像這樣
-1*(return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.