繁体   English   中英

Java集合中的排序函数

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM