Сортировка по сумме цифр в числе

Дана строка с числами, разделёнными пробелом. Нужно отсортировать эти числа по сумме цифр.
in:
20 100 35 53 12 9 71 13
out:
100 20 12 13 35 53 71 9
  1. import java.util.Comparator;
  2. import java.util.stream.Collectors;
  3. import java.util.stream.Stream;
  4.  
  5. public class WeightSort {
  6.  
  7.     public static void main(String[] args) {
  8.         System.out.println(sortByWeight("56 65 100 2000 103 123 4444 99 180 90"));
  9.         // 100 2000 103 123 180 90 56 65 4444 99
  10.     }
  11.  
  12.     public static String sortByWeight(String input) {
  13.         return Stream.of(input.split("\\s+"))
  14.                 .sorted(Comparator
  15.                         .comparingInt((String s) -> s.chars().map(n -> n - '0').sum())
  16.                         .thenComparing(String::compareTo))
  17.                 .collect(Collectors.joining(" "));
  18.     }
  19. }
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(" "))

Реклама

Мы в соцсетях

tw tg yt gt