根据条件(上升或下降)对列表进行排序



我想根据两个属性但在某些条件下对列表进行排序。下类有两个属性 - 会员成员名单。值如下。

obj ()
{
   memberid;
   membernumber;
}
Values Assigned : 
obj1 = {1,15}
obj2 = {3,10}
obj3 = {2,20}
obj4 = {2,10}
obj5 = {3,15}
obj6 = {4,25}
obj7 = {2,50}

我们需要排序为:

首先基于memberId,如果成员ID相同,则基于membernumber的最高membernumber应该首先出现。因此,输出应为:

obj1 = {1,15}
obj7 = {2,50} >> As 2 are multiple sort on membernumber as highest being 50
obj3 = {2,20}
obj4 = {2,10}
obj5 = {3,15}
obj2 = {3,10}
obj6 = {4,25}

我能够使用Collections.Sort根据成员进行对其进行排序。但是,不确定如何具有相等的条件并根据成员名字进行排序。

任何帮助都将不胜感激。

我在Collections.sort()中使用的排序类。

public class sortId implements Comparator<obj > {
public int compare(obj o1, obj o2)
   {
     int id1 =  o1.getmemberId();
     int id2 =  o2.getmemberId();       
     return id1 - id2 ;     
    }
}

您可以使用 Collections.sort,并且要排序您可以使用否定的逆向您的倒数,例如:

List<obj> list = Arrays.asList(new obj(1, 15), new obj(3, 10), new obj(2, 20),
        new obj(2, 10), new obj(3, 25), new obj(2, 50));
Collections.sort(list, new Comparator<obj>() {
    @Override
    public int compare(obj o1, obj o2) {
        if (o1.getMemberid() != o2.getMemberid()) {
            return o1.getMemberid() - o2.getMemberid();
        } else {
            //for the second sort you can use negative to sort descending
            return -(o1.getMembernumber() - o2.getMembernumber());
            //     ^-------------------------------------------------------
        }
    }
});

输出

[{1,15}, {2,50}, {2,20}, {2,10}, {3,25}, {3,10}]

您可以使用比较器接口进行自定义排序和覆盖与嵌套逻辑进行比较方法。

您可以使用比较器中的静态方法,然后在comparing之后考虑thenComparing。例如。如果您的列表为objs,并且具有适当的Getters:

objs.sort(comparingInt(Obj::getMemberid)
    .thenComparing(comparingInt(Obj::getMembernumber).reversed()));

objs.sort(comparingInt(Obj::getMemberid)
    .thenComparing(Obj::getMembernumber, reverseOrder()));

请注意,.reversed()reverseOrder()是如何使用membernumber的降序排序的,但默认为memberid

您的代码在其中一半。您想念的是第一次检查相等的情况,因此您应该实施类似的事情:

public int compare(obj o1, obj o2)
{
    int id1 =  o1.getmemberId();
    int id2 =  o2.getmemberId();
    if (id1 == id2) {
         // check other condition, return result
    }
    else {
        return id1 - id2;
    }
}

作为旁注:遵循命名约定,然后在骆驼中命名您的类(Obj而不是obj(

最新更新