#java #arrays #list #sorting
#java #массивы #Список #сортировка
Вопрос:
Я хочу отсортировать список списков, например:
List<List<String>> listOflists = new ArrayList();
List<String> b = {"x", "x"};
List<String> a = {"x"};
List<String> c = {"x", "x", "x"};
listOflists.add(a);
listOflists.add(b);
listOflists.add(c);
//Oder by size of the array
List<String> sortedList = listOflists.stream().sorted().collect(Collectors.toList());
Я ожидал, что listOfLists в процессе forEach:
Lopp 1 x Lopp 2 x,x Lopp 3 x,x,x
Комментарии:
1. Просто любопытно: откуда берется строка
Lopp 1
? Я не вижу этого в вашем коде.2. Если ваша цель состоит в том, чтобы отсортировать их на основе размера списка, то вы можете указать это в
sorted
методе, предоставив Comparator, который будет делать это следующим образомsorted(Comparator.comparing(List::size))
. Но что сбивает с толку, так это возвращаемый типsortedList
. Должно ли это бытьList<List<String>> sortedList
вместоList<String> sortedList
?3. Ваш вопрос требует более подробной информации. Ожидаемого результата недостаточно. Каковы ваши требования к сортировке? Количество элементов, лексический ранг каждого элемента, что делать, если два списка имеют одинаковое количество и / или типы элементов. и т.д.? Вы должны быть явными.
Ответ №1:
Arrays.compare сравнивает два массива объектов в сопоставимых элементах лексикографически.
Попробуйте это.
List<List<String>> listOflists = Arrays.asList(
Arrays.asList("x", "x"),
Arrays.asList("x"),
Arrays.asList("x", "x", "x")
);
List<List<String>> sortedList = listOflists.stream()
.map(list -> list.toArray(String[]::new))
.sorted((x, y) -> Arrays.compare(x, y))
.map(array -> Arrays.asList(array))
.collect(Collectors.toList());
System.out.println(sortedList);
вывод:
[[x], [x, x], [x, x, x]]
Если вы хотите отсортировать по размеру списка.
List<List<String>> sortedList = listOflists.stream()
.sorted(Comparator.comparing(list -> list.size()))
.collect(Collectors.toList());
Комментарии:
1. Вау!
Arrays.compare
это действительно приятная функция 🙂