Comi
Comi

Reputation: 1

Sorting with Apache Commons CompareToBuilder descending order

I want to sort a collection by multiple fields (some of them in descending order) using Apache Commons CompareToBuilder

Ie:

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

The default behavior for null values (ie. z, b, a, 1, null) is still true? Or null values comes first in this case?

How to compare objects by multiple fields

Upvotes: 0

Views: 2206

Answers (1)

Matt
Matt

Reputation: 928

Try this on for size. To sort a single parameter descending, all you have to do is swap the parameters in the builder's append method (b.append(p2.name, p1.name) instead of b.append(p2.name, p1.name)). A little extra logic is required to put nulls the opposite of where they would naturally go (first when sorting asc, last when sorting 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();
    }
});

Upvotes: 1

Related Questions