如何通过多个规则对ArrayList中的对象进行排序

时间:2019-05-06 12:09:21

标签: java sorting arraylist collections


我有一个Java ArrayList,其中包含一些类型为ObjType的对象。

假设该对象具有两个字段:
- boolean 字段isManual()
- double 值getAffinity()

我正在尝试基于多个条件来订购此ArrayList:
-首先,所有具有isManual = true的对象的顺序与它们在ArrayList中已有的顺序相同
-然后我希望所有具有isManual = false的对象按getAffinityValue顺序排列(从最低到最大)

我想出了下面的代码,该代码不起作用(似乎是随机排序):

Collections.sort(coda, new Comparator<ObjType>() {

            public int compare(ObjType a, ObjType b) {
                boolean b1=a.isManual();
                boolean b2=b.isManual();
                if(b1 && b2) {
                    if (a.getAffinity() < b.getAffinity()) return 1;
                    if (a.getAffinity() > b.getAffinity()) return -1;
                    return 0;
                }
                if (b1) return -1;
                if (b2) return 1;
                if (a.getAffinity() < b.getAffinity()) return 1;
                if (a.getAffinity() > b.getAffinity()) return -1;
                return 0;
            }
}

有什么建议吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

  

首先使用isManual = true的所有对象,其顺序相同   已经在ArrayList

然后,在两个对象都具有isManual == true的情况下,您不应返回0以外的任何内容。

  

然后我希望所有isManual = false的对象由   getAffinityValue(从最低到最大)

然后这些行:

if (a.getAffinity() < b.getAffinity()) return 1;
if (a.getAffinity() > b.getAffinity()) return -1; 

应该返回它们返回的相反值。
所以试试这个:

Collections.sort(coda, new Comparator<ObjType>() {
    public int compare(ObjType a, ObjType b) {
        boolean b1=a.isManual();
        boolean b2=b.isManual();

        if(b1 && b2) return 0;
        if (b1) return -1;
        if (b2) return 1;

        Double affinity1 = a.getAffinity();
        Double affinity2 = b.getAffinity();
        return affinity1.compareTo(affinity2);
    }
});