2017-05-03 84 views
2

我想排序基于两个属性,但在一定条件下的列表中。 下面的类有两个属性 - 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应该放在第一位。所以输出应该是:

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的成员Id排序,但我不知道如何有一个平等的条件和排序它的基础上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 ;  
    } 
} 
+0

覆盖的collection.sort方法 –

+1

我不知道这是一个重复,或者如果你实际上是在寻找比较,你需要的功能,但无论如何 - 这里看看:https://stackoverflow.com/问题/ 2839137 /如何使用的比较器功能于Java到排序 – MByD

+0

@MByD - 这是比较正常执行。我将添加我在我的问题中写的类比较器类。它只在memberId不知道如何编写membernumber的逻辑,我希望它只为具有相同memberIds的对象排序memberNumber。 – Suraj

回答

1

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

实际上它应该是[{1,15},{2,50},{2,20},{2,10},{3,25},{3,10}] – Suraj

+0

我会相应地编辑它谢谢 – Suraj

+0

没有关于这个需要Java 8. – shmosel

2

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

+0

我已经添加了我在上述类似的问题中编写的正常比较器实现。它只在memberId不知道如何编写membernumber的逻辑,我希望它只为具有相同memberIds的对象排序memberNumber。 – Suraj

+0

'\t public int compare(obj o1,obj o2)if(e1.getmemberId()> e2.getmemberId()){ return 1; (e1.getmemberId() e2.getmemberNo()){ \t返回1; \t} else { \t return -1; \t \t} \t} \t}' –

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

补充说明:遵循命名约定,并在驼峰命名类(Obj而不是obj

+0

是啊,我只是写在问题的类有不同的名称和属性。虽然 – Suraj

1

您可以使用从比较静态方法这一点,与当时thenComparing已经考虑到comparing后。例如。如果你的列表是objs并具有相应的干将:

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

或者

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

注意如何.reversed()reverseOrder()用于在membernumber但默认的升序降序排序为memberid排序。

+0

第二个值需要按降序排序。 – shmosel

+0

@shmosel正确!我注意到我自己,并在输入评论时更新了我的答案 –