Reputation: 1
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
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