Как я могу отсортировать список list в Java?

#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 это действительно приятная функция 🙂