Sort a List of Lists in Java
This post will discuss how to sort a List of Lists in Java.
1. Sort in lexicographical order
We can sort a list in lexicographical order using a custom comparator. The following code implements a custom comparator and passes it to List’s sort() method.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // Input list List<List<Integer>> input = new ArrayList<>(Arrays.asList( Arrays.asList(1, 3, 2, 2), Arrays.asList(1, 2, 1, 2), Arrays.asList(1, 3, 1, 2) )); // Sort in lexicographical order using custom comparator input.sort((x, y) -> { for (int i = 0; i < Math.min(x.size(), y.size()); i++) { if (x.get(i) != y.get(i)) { return x.get(i) - y.get(i); } } return x.size() - y.size(); }); input.stream().forEach(System.out::println); } } |
Output:
[1, 2, 1, 2]
[1, 3, 1, 2]
[1, 3, 2, 2]
2. Sort individual lists in ascending order
We can also sort individual lists in ascending order using a Comparator. The following code uses Stream API to sort each list using Comparator.naturalOrder() comparator.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // Input list List<List<Integer>> input = new ArrayList<>(Arrays.asList( Arrays.asList(1, 3, 2), Arrays.asList(1, 2, 1, 2), Arrays.asList(1, 3, 1) )); input.stream().map(l -> { l.sort(Comparator.naturalOrder()); return l; }).collect(Collectors.toList()); input.stream().forEach(System.out::println); } } |
Output:
[1, 2, 3]
[1, 1, 2, 2]
[1, 1, 3]
3. Sort in lexicographical and ascending order
We can merge #1 and #2 to sort the outer list in lexicographical order and inner lists in ascending order.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import java.util.*; import java.util.stream.Collectors; public class Main { // Custom comparator public static Comparator<List<Integer>> comparator = (x, y) -> { for (int i = 0; i < Math.min(x.size(), y.size()); i++) { if (x.get(i) != y.get(i)) { return x.get(i) - y.get(i); } } return Integer.compare(x.size(), y.size()); }; public static void main(String[] args) { // Input list List<List<Integer>> input = new ArrayList<>(Arrays.asList( Arrays.asList(1, 3, 2, 2), Arrays.asList(1, 2, 1, 2), Arrays.asList(1, 3, 1, 2), Arrays.asList(1, 1, 1), Arrays.asList(2, 3), Arrays.asList(2, 1) )); // Sort in lexicographical order input.sort(comparator); // Sort individual lists in ascending order input.stream().map(l -> { Collections.sort(l, Comparator.naturalOrder()); return l; }).collect(Collectors.toList()); input.stream().forEach(System.out::println); } } |
Output:
[1, 1, 1]
[1, 1, 2, 2]
[1, 1, 2, 3]
[1, 2, 2, 3]
[1, 2]
[2, 3]
That’s all about sorting a List of Lists in Java.
Thanks for reading.
To share your code in the comments, please use our online compiler that supports C, C++, Java, Python, JavaScript, C#, PHP, and many more popular programming languages.
Like us? Refer us to your friends and support our growth. Happy coding :)