根据条件排序列表(升序或降序)

时间:2017-05-03 17:53:36

标签: java sorting arraylist collections

我想基于两个属性对列表进行排序,但在某些条件下。 下面的类有两个属性 - memberid,membernumber。价值如下。

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的成员ID应该排在第一位。所以输出应该是:

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基于MemberId对其进行排序,但我不确定如何使用相同的条件并根据MemberNumber对其进行排序。

感谢任何帮助。

我在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 ;     
    }
}

4 个答案:

答案 0 :(得分:2)

您可以使用比较器界面进行自定义排序,并使用嵌套逻辑覆盖比较方法。

答案 1 :(得分:2)

您可以使用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}]

答案 2 :(得分:1)

您可以使用Comparator中的静态方法,然后在thenComparing之后考虑comparing。例如。如果您的列表是objs并且具有相应的getter:

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

或者

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

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

答案 3 :(得分:0)

你的代码就在那里。你错过的是第一次检查是相同的情况,所以你应该实现类似的东西:

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;
    }
}

作为旁注:遵循命名约定,并在CamelCase中命名您的类(Obj而不是obj