我想使用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)仍然是真的吗? 或者在这种情况下,空值首先出现?
答案 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();
}
});