Sort – sort a table across multiple comparator items

I need to use multiple comparator objects in Java 8 to sort the list of item objects

The application creates a comparator for each user action It stores comparator objects in ArrayList You can sort one comparator item, but now we need a way to sort multiple comarator items at the same time

I use this line of code to sort the list:

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

The variable groupingcomparator comes from the comparator < item > type

Now I need to sort multiple fields stored in it

ArrayList<Comparator<Item>>

Is this possible in Java 8? How can I achieve it?

Solution

You can link multiple comparators together using thencomparing (comparator) method provided by the comparator interface See the following example to create such a chained comparator from a list using a stream

The domain class we want to use for sorting:

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;
    }
}

Example code:

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));
}

This code snippet will print the order first sorted by item name by customer

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>