0

我想按两个布尔值对日期和顺序进行排序,但结果是错误的。首先按日期排序,如果 boolean1 和 boolean 2 为 false 优先级高,next:boolean 2 为 true

List<Project> list = new ArrayList<>();
list.add(new Project(false, false, new Date("1/1/2019"), "Jet" , "1"));
list.add(new Project(true, false, new Date("1/1/2019"), "Sang", "2"));
list.add(new Project(false, false, new Date("1/1/2019"), "Dung", "1"));
list.add(new Project(false, true, new Date("1/1/2020"), "Long", "1"));
list.add(new Project(true, false, new Date("1/1/2020"), "Nguyen", "3"));
list.add(new Project(true, false, new Date("1/1/2020"), "Khang", "2"));

Collections.sort(list, new Comparator<Project>() {

    @Override
    public int compare(Project o1, Project o2) {
        // TODO Auto-generated method stub
        int result = o1.date.compareTo(o2.date);
        if (result != 0) return result;
        boolean o1boolean1 = o1.boolean1;
        boolean o1boolean2 = o1.boolean2;
        boolean o2boolean1 = o2.boolean1;
        boolean o2boolean2 = o2.boolean2;
        result = Boolean.compare((!o1boolean1 && !o1boolean2), (!o2boolean1 && !o2boolean2));
        if (result != 0) {
            return result;
        }
        return Boolean.compare(o1boolean2, o2boolean2);
    }
});

for(Project pp : list) {
    System.out.println(pp.name);
}

我的结果:Jet,Dung,Sang,Long,Nguyen,Khang 请帮帮我。

4

2 回答 2

1

根据您的示例,布尔对的预期顺序似乎是(F,F) < (F,T) < (T,F).

表达这种顺序的一种方法是通过将每个 (boolean, boolean) 对映射为表示其在我们的顺序中的优先级/位置的数值。例如,可以通过以下方法处理此类映射:

//(F,F) < (F,T) < (T,F)
//  0       1       2
private static int priority(boolean b1, boolean b2){
    if (b1==false && b2==false)     return 0;
    if (b1==false && b2==true)      return 1;
    if (b1==true  && b2==false)     return 2;
    throw new IllegalArgumentException("both booleans can't be true at the same time");
}

然后我们所要做的就是比较布尔对的优先级,就像我们比较整数一样:

public int compare(Project o1, Project o2) {
    // TODO Auto-generated method stub
    int result = o1.date.compareTo(o2.date);
    if (result != 0) return result;
    int priority1 = priority(o1.boolean1, o1.boolean2);
    int priority2 = priority(o2.boolean1, o2.boolean2);
    return Integer.compare(priority1, priority2);
}

演示

class SO61985917 {

    //(F,F) < (F,T) < (T,F)
    //  0       1       2
    private static int priority(boolean b1, boolean b2){
        if (b1==false && b2==false)     return 0;
        if (b1==false && b2==true)      return 1;
        if (b1==true  && b2==false)     return 2;
        throw new IllegalArgumentException("both booleans can't be true at the same time");
    }

    public static void main(String[] args) throws Exception {

        List<Project> list = new ArrayList<>();
        list.add(new Project(false, false, new Date("1/1/2019"), "Jet" , "1"));
        list.add(new Project(true, false, new Date("1/1/2019"), "Sang", "2"));
        list.add(new Project(false, false, new Date("1/1/2019"), "Dung", "1"));
        list.add(new Project(false, true, new Date("1/1/2020"), "Long", "1"));
        list.add(new Project(true, false, new Date("1/1/2020"), "Nguyen", "3"));
        list.add(new Project(true, false, new Date("1/1/2020"), "Khang", "2"));

        Collections.sort(list, new Comparator<Project>() {
            @Override
            public int compare(Project o1, Project o2) {
                // TODO Auto-generated method stub
                int result = o1.date.compareTo(o2.date);
                if (result != 0) return result;
                int priority1 = priority(o1.boolean1, o1.boolean2);
                int priority2 = priority(o2.boolean1, o2.boolean2);
                return Integer.compare(priority1, priority2);
            }
        });

        for(Project pp : list) {
            System.out.println(pp.name);
        }

    }
}

输出:

Jet
Dung
Sang
Long
Nguyen
Khang

自从您说以来,这似乎就是您想要的:

I wan 结果 :Jet, Dung, Sang, Long, Nguyen, Khang

于 2020-05-24T13:46:08.107 回答
0

根据您的意见,订单将是(F, F) (T, F), (F, T)

那么这应该工作

public int compare(Project o1, Project o2) {
    int result = o1.date.compareTo(o2.date);
    if (result != 0) return result;
    if(o1.boolean2 != o2.boolean2)return ((!o2.boolean2): 1 : -1);
    if(o1.boolean1 != o2.boolean1)return ((!o2.boolean1): 1 : -1);
    return 0;
}
于 2020-05-24T14:22:42.407 回答