Как сделать сортировку в Java, если в одном имени переменной и имени присутствуют оба - PullRequest
0 голосов
/ 14 января 2019

Я делаю сортировку, поэтому использую загрузку Java, и я использую потоки, в настоящее время отсортированные по

код сортировки: -

projectResponse.setDetails(v.stream()
                    .sorted(Comparator.comparing(StateResponse::getState)
                            .thenComparing(Comparator.comparing(NameResponse::getName)))
                    .collect(Collectors.toList()));

Сортировать сначала по состоянию, а затем по имени.

Мое имя имеет значение что-то вроде: "имя-98", "имя-99", "имя-100" поэтому, когда он сортирует, он сортирует правильно до 99, но когда приходит 100, это первое отсортированное число, а затем сортировка верна от 100 101,102, и эта ситуация снова наступит, когда no будет пересекать 999, а затем сортировка будет поступать правильно с 1000, 1001 , Каково лучшее решение для преодоления этого?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Сравните часть имени и затем сравните часть числа. Пример: - * +1001 *

List<String> list = List.of("name-99", "name-98", "name-100");
List<String> sortedList = list.stream()
        .sorted(Comparator.comparing(s -> ((String) s).substring(0, ((String) s).indexOf("-")))
                .thenComparing(o -> Integer.parseInt(((String) o).substring(((String) o).indexOf("-") + 1))))
        .collect(Collectors.toList());
System.out.println(sortedList);

выход

[name-98, name-99, name-100]
0 голосов
/ 14 января 2019

Полезно использовать собственный компаратор, который сортирует числа в числовом порядке, в то же время сортируя текст в алфавитном порядке. Это часто называют «натуральным сортом». Вот одна реализация, которая делает это: http://www.davekoelle.com/alphanum.html.

Чтобы использовать его в своей потоковой операции:

thenComparing(NameResponse::getName, new AlphanumComparator())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...