2

(Java 8) I have an ArrayList of ArrayLists as follows:

[5, 10]

[2, 11]

[1, 12]

[8, 13]

I want these lists to be sorted by the first value in the list in either ascending or descending order. For example, with ascending order, the ArrayList would be ordered as:

[1, 12]

[2, 11]

[5, 10]

[8, 13]

How can I do this?

I am struggling with using the comparator class. Other documentation I have seen refers to when this data is represented by an array, (Arrays.sort then defining a comparator in the argument), but when it is a List of ArrayLists I cannot figure out the solution.

1 Answer 1

1

With Stream API (Java 8):

public static void main(String[] args) {
    List<List<Integer>> list = new ArrayList<>();

    list.add(asList(5, 10));
    list.add(asList(2, 11));
    list.add(asList(1, 12));
    list.add(asList(8, 15));

    System.out.println("sorted asc = " + list.stream()
            .sorted(Comparator.comparing(o -> o.get(0)))
            .collect(Collectors.toList()));

    System.out.println("sorted desc = " +  list.stream()
            .sorted((i, j) -> -i.get(0).compareTo(j.get(0)))
            .collect(Collectors.toList()));
}

private static List<Integer> asList(Integer... arr) {
    return Arrays.asList(arr);
}

sorted asc = [[1, 12], [2, 11], [5, 10], [8, 15]]

sorted desc = [[8, 15], [5, 10], [2, 11], [1, 12]]

Sign up to request clarification or add additional context in comments.

2 Comments

Stream and collecting into a new list is not realy needed just to sort the list. Just list.sort(Comparator.comparing(o -> o.get(0))); for ascending and list.sort(Comparator.comparing(o -> o.get(0), Comparator.reverseOrder())); for descending order is enough.
Eritrean's solution uses less resources I assume

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.