Сортировка по сумме цифр в числе
Дана строка с числами, разделёнными пробелом. Нужно отсортировать эти числа по сумме цифр.
in:
20 100 35 53 12 9 71 13
out:
100 20 12 13 35 53 71 9
in:
20 100 35 53 12 9 71 13
out:
100 20 12 13 35 53 71 9
- import java.util.Comparator;
- import java.util.stream.Collectors;
- import java.util.stream.Stream;
- public class WeightSort {
- public static void main(String[] args) {
- System.out.println(sortByWeight("56 65 100 2000 103 123 4444 99 180 90"));
- // 100 2000 103 123 180 90 56 65 4444 99
- }
- public static String sortByWeight(String input) {
- return Stream.of(input.split("\\s+"))
- .sorted(Comparator
- .comparingInt((String s) -> s.chars().map(n -> n - '0').sum())
- .thenComparing(String::compareTo))
- .collect(Collectors.joining(" "));
- }
- }
1. Разбиваем исходную строку на массив подстрок по пробелу:
input.split("\\s+")
"56 65 100" -> new String[] {"56", "65", "100"}
2. Создаём из массива Stream, затем вызывает оператор сортировки по заданному компаратору.
3. Компаратор принимает строку, сначала сравнивает по функции, которая возвращает сумму цифр:
s.chars().map(n -> n - '0').sum()
и если суммы равны, тогда сравнивает строки обычным способом:
thenComparing(String::compareTo)
3.1. Для подсчета суммы цифр числа, берём из строки ASCII-код символа, отнимаем код символа 0. Это даст нам численное представление символа '0' - '0' = 0, '5' - '0' = 5. Полученные числа суммируем:
s.chars().map(n -> n - '0').sum()
4. После того, как отсортировали подстроки, объединяем их в одну строку, использовав в качестве разделителя пробел.
collect(Collectors.joining(" "))
input.split("\\s+")
"56 65 100" -> new String[] {"56", "65", "100"}
2. Создаём из массива Stream, затем вызывает оператор сортировки по заданному компаратору.
3. Компаратор принимает строку, сначала сравнивает по функции, которая возвращает сумму цифр:
s.chars().map(n -> n - '0').sum()
и если суммы равны, тогда сравнивает строки обычным способом:
thenComparing(String::compareTo)
3.1. Для подсчета суммы цифр числа, берём из строки ASCII-код символа, отнимаем код символа 0. Это даст нам численное представление символа '0' - '0' = 0, '5' - '0' = 5. Полученные числа суммируем:
s.chars().map(n -> n - '0').sum()
4. После того, как отсортировали подстроки, объединяем их в одну строку, использовав в качестве разделителя пробел.
collect(Collectors.joining(" "))