【问题标题】:Sorting with Apache Commons CompareToBuilder descending order使用 Apache Commons CompareToBuilder 降序排序
【发布时间】:2018-06-18 22:52:20
【问题描述】:

我想使用 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

【问题讨论】:

    标签: java apache sorting apache-commons


    【解决方案1】:

    试穿它的大小。要对单个参数进行降序排序,您所要做的就是在构建器的 append 方法中交换参数(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();
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多