[英]Sort function in Java collections
如果我有以下學生對象列表,
obj1.Name = "ABC";
obj1.Rank = 5;
obj2.Name = "DEF",
obj2.Rank = 3;
obj3.Name = "GHI";
obj3.Rank = 2;
obj4.Name = "JKL";
obj4.Rank = 0;
obj5.Name = "MNO";
obj5.Rank = 1;
obj6.Name = "PQR";
obj6.Rank = 4;
我需要按以下順序對這些對象進行排序。
obj5,
obj3,
obj2,
obj6,
obj1,
obj4.
我試過下面的代碼,
Collections.sort(studentList, new Comparator<Student>() {
@Override
public int compare(Student obj2, Student obj1) {
return obj2.Rank.compareTo(obj1.Rank);
}
});
我得到以下結果。
obj4,//this should be in last position
obj5,
obj3,
obj2,
obj6,
obj1.
但我需要所有的零應該是最后。
將它們排序為 0 高於任何值的更好方法是:
Collections.sort(StudentList, new Comparator<Student>() {
@Override
public int compare(Student obj1, Student obj2) {
if(obj1.Rank==0) return (obj2.Rank==0) ? 0 : 1;
if(obj2.Rank==0) return -1;
return Integer.compare(obj1.Rank,obj2.Rank);
}
});
這將正確處理obj.Rank=Integer.MAX_VALUE
的情況。
如果您的Rank
是 Integers 而不是int
您還需要處理它們為null
的情況。
如果您想將 0 排在最后一個排序順序,而其他人則按升序排列(即:1、2、3、4、5、0),您需要編寫一個自定義Comparator
,將 0 視為最大值。 可能是這樣的:
Collections.sort(StudentList, new Comparator<Student>() {
@Override
public int compare(Student obj1, Student obj2) {
Integer compareRank1 = obj1.Rank == 0 ? Integer.MAX_VALUE : obj1.Rank;
Integer compareRank2 = obj2.Rank == 0 ? Integer.MAX_VALUE : obj2.Rank;
return compareRank1.compareTo(compareRank2);
}
});
您可以編輯比較方法,並檢查零
Collections.sort(studentList, new Comparator<Student>() {
@Override
public int compare(Student obj2, Student obj1) {
if(obj1.rank ==0 ){
if(obj2.rank ==0){
// when both count are zero then you can handle here
}
// return positive int beacuse zero is greater than everyother count
}
else return obj2.Rank.compareTo(obj1.Rank);
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.