Search code examples
javasortingarraylistcomparator

How to sort an ArrayList of ArrayLists (by one of the variables) in Java?


(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.


Solution

  • 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]]