【问题标题】:Sort table on multiple Comparator items在多个比较器项目上排序表
【发布时间】:2016-10-17 14:31:27
【问题描述】:

我需要在 Java 8 中使用多个 Comparator 对象对 Item 对象列表进行排序。

应用程序为每个用户操作创建一个比较器。它将比较器对象存储在 ArrayList 中。可以对一个 Comparator 项进行排序,但现在我们需要一种方法可以同时对多个 Comarator 项进行排序。

我用来对列表进行排序的这行代码:

tbl.getItems().stream().sorted(groupingComparator);

变量 groupingComparator 来自类型Comparator<Item>

现在我需要对存储在的多个字段进行排序

ArrayList<Comparator<Item>>

这在 Java 8 中可行吗?我该如何实现呢?

【问题讨论】:

    标签: sorting lambda java-8 comparator


    【解决方案1】:

    您可以使用 Comparator 接口提供的 thenComparing(Comparator) 方法将多个 Comparator 链接在一起。请参阅下面的示例,以使用流从列表创建这样的链式比较器。

    我们要用于排序的领域类:

    public static class Order {
        String customer;
        String item;
    
        public Order(String customer, String item)
        {
            this.customer = customer;
            this.item = item;
        }
    
        public String toString() {
            return "Customer: " + customer + " Item: " + item;
        }
    }
    

    示例代码:

    public static void main(String... args) throws Throwable
    {
        List<Order> orders = new ArrayList<>();
        orders.add(new Order("A", "Item 1"));
        orders.add(new Order("B", "Item 3"));
        orders.add(new Order("A", "Item 2"));
        orders.add(new Order("B", "Item 1"));
    
        List<Comparator<Order>> comparators =
            Arrays.asList((o1, o2) -> o1.customer.compareTo(o2.customer), // comparator for customer names
                          (o1, o2) -> o1.item.compareTo(o2.item));        // comparator for item names
    
        Comparator<Order> comp =
            comparators.stream()
                       .reduce(Comparator::thenComparing)
                       // use a default comparator if the comparator list was empty
                       .orElse(Comparator.comparing(Object::toString));
    
        orders.stream().sorted(comp).forEach((order) ->  System.out.println(order));
    }
    

    此 sn-p 将打印首先按客户然后按项目名称排序的订单。

    【讨论】:

      【解决方案2】:

      就这么简单:

      public class CompositeComparator implements Comparator<Item> {
          private List<Comparator<Item>> comparators;
      
          public CompositeComparator(List<Comparator<Item>> comparators) {
              this.comparators = comparators;
          }
      
          @Override
          public int compare(Item o1, Item o2) {
              int result = 0;
              for (Comparator<Item> c : comparators) {
                  result = c.compare(o1, o2);
                  if (result != 0) {
                      break;
                  }
              }
              return result;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 2023-01-09
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        相关资源
        最近更新 更多