[英]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.