如何在两个不同的字段上使用Collections.sort()?

时间:2015-09-29 06:32:50

标签: java sorting arraylist collections

我有一个Member类,如下所示:

public class Member {
    private int value1;
    private boolean value2;
}

包含此数据的ArrayList<Member>

value1 - value2

  • 1 - false
  • 2 - false
  • 3 - true
  • 4 - false
  • 5 - true

现在我希望以这种方式对这些数据进行排序:

  • 必须首先返回value2为true的成员,然后返回
  • 之后的其他成员
  • 在每个子列表中,成员将从最高value1
  • 返回

所以最后,列表应该按以下顺序包含数据:5,3,4,2,1。

我知道我可以使用Collections.sort()按值1对数据进行排序:

Collections.sort(memberList, new Comparator<Member>(){
    public int compare(Member m1, Member m2){
        return m1.getValue1() - m2.getValue1();
    }
});

但是有没有办法按同一个compare方法对这两个标准数据进行排序?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以先按value2进行比较,然后按value1比较平局:

Collections.sort(memberList, new Comparator<Member>(){
    public int compare(Member m1, Member m2){
        int comp = Boolean.compare(m1.getValue2(), m2.getValue2());

        if (comp == 0) {
            // case where 'value2' is the same for both inputs
            // in this case use 'value1' to compare
            comp = m1.getValue1() - m2.getValue1();
        }
        return comp;
    }
});

答案 1 :(得分:2)

Collections.sort(memberList, new Comparator<Member>(){
    public int compare(Member m1, Member m2){
        int res = Boolean.compare(m2.getValue2(), m1.getValue2());
        if(res == 0) res = Integer.compare(m2.getValue1(), m1.getValue1());
        return res;
    }
});

这可以在Java-8中更简单地完成:

Collections.sort(memberList, 
       Comparator.comparing(Member::getValue2).thenComparing(Member::getValue1).reversed());