使用Apache Commons CompareToBuilder降序排序

时间:2017-10-12 11:06:43

标签: java apache sorting apache-commons

我想使用Apache Commons CompareToBuilder按多个字段(其中一些按降序排序)对集合进行排序

即:

Collections.sort(pizzas, new Comparator<Pizza>() {  
    @Override  
    public int compare(Pizza p1, Pizza p2) {  
        return new CompareToBuilder().append(p1.size, p2.size).append(p1.nrOfToppings, p2.nrOfToppings).append(p1.name, p2.name).toComparison();  
    }  
});

空值的默认行为(即.z,b,a,1,null)仍然是真的吗? 或者在这种情况下,空值首先出现?

How to compare objects by multiple fields

1 个答案:

答案 0 :(得分:1)

尝试使用此尺寸。要对单个参数进行降序排序,您只需在构建器的追加方法(b.append(p2.name, p1.name)而不是b.append(p2.name, p1.name))中交换参数。需要一点额外的逻辑来将空值与它们自然的位置相反(首先在排序asc时,最后在排序desc时)。

final boolean nullsLast = ...
Collections.sort(pizzas, new Comparator<Pizza>() {
    @Override
    public int compare(Pizza p1, Pizza p2) {
        CompareToBuilder b = new CompareToBuilder()
            .append(p2.size, p1.size) // p2 as first parameter to sort desc, nulls last
            .append(p1.nrOfToppings, p2.nrOfToppings); // sort nrOfToppings asc, nulls first
        // sort name asc, nulls first or last depending on parameter
        if (nullsLast && p1.name == null) {
            b.append(p2.name, p1.name); // null last
        }
        else {
            b.append(p1.name, p2.name); // null first
        }

        return b.toComparison();
    }
});