sorting - 对多个比较器项目进行排序

标签 sorting lambda java-8 comparator

我需要 Java 8 中的一种方法来对多个 Comparator 对象上的 Item 对象列表进行排序。

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

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

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

变量 groupingComparator 来自类型 Comparator<Item>

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

ArrayList<Comparator<Item>>

这在 Java 8 中可能吗?我该如何实现这个?

最佳答案

您可以使用 Comparator 接口(interface)中提供的 thenComparing(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));
}

此代码段将打印先按客户排序,然后按商品名称排序的订单。

关于sorting - 对多个比较器项目进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37852996/

相关文章:

c++ - 我应该预防性地 move 可调用对象(例如 lambda 吗?)

java - 如何在 Java 8 中从 CompletableFuture<List<CustomObject>> 获取结果

sorting - Silverstripe 3 : how to sort pages in the CMS sitetree by title, 日期等

perl - 在散列中的小写键值之前对大写字母进行排序

php - sql语句从其他表中使用NOT IN排序

ruby - 使用附加参数调用 block 中的所有方法

java - 2 compareTo 方法在同一个类定义中被覆盖,我怎么能强制使用第二个?

java - LambdaConversionException 与泛型 : JVM bug?

Java 8 - 为什么 JFrame 会移动?

java - java 8 获取和编辑子列表位于主列表中