Поиск суммы всех чисел, входящих в строку [закрыт]

149
31 мая 2019, 03:50

Требуется найти сумму всех чисел, входящих в строку.
К примеру, строка abb25bb25. Должно вывестись число 50. Какими методами можно добиться данного результата?

Answer 1
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        String s = "abb25bb25";
        // пример для Integer можно расшрить для Float, Double, BigDecimal и т.д. 
        NumbersExtractor<Integer> extractor = new IntegerExtractorByRegex();
        List<Integer> numbers = extractor.extract(s);
        System.out.println(numbers);
        int sum = numbers.stream().mapToInt(Integer::intValue).sum();
        System.out.println(sum);
    }
    interface NumbersExtractor<N extends Number> {
        List<N> extract(String input);
    }
    // проходясь по циклы из char's
    static class IntegerExtractorByCharArray implements NumbersExtractor<Integer> {
        @Override
        public List<Integer> extract(String input) {
            List<Integer> numbers = new ArrayList<>();
            StringBuilder builder = new StringBuilder();
            for (char c : input.toCharArray()) {
                if (Character.isDigit(c)) {
                    builder.append(c);
                } else {
                    if (builder.length() > 0) {
                        numbers.add(Integer.valueOf(builder.toString()));
                        builder = new StringBuilder();
                    }
                }
            }
            if (builder.length() > 0) {
                numbers.add(Integer.valueOf(builder.toString()));
            }
            return numbers;
        }
    }
    // используя split/Regex
    static class IntegerExtractorByRegex implements NumbersExtractor<Integer> {
        @Override
        public List<Integer> extract(String input) {
            String[] split = input.split("\\D+");
            return Arrays.stream(split).filter(s -> !s.isEmpty()).map(Integer::valueOf).collect(Collectors.toList());
        }
    }
}
Answer 2

Для целых неотрицательных чисел можно использовать простой подход. Встретили цифру - "дописали" её к текущему числу, а если не цифру - добавили то, что накопилось, к общей сумме (для оптимизации можно ещё не модифицировать сумму, если "нецифра" уже не первая). Пример на Python (48=0x30 - код нуля)

s = "3abb0250b00b25"
summ = 0
val = 0
for c in s:
    if 48 <= ord(c) <= 57:
        val = val * 10 + ord(c) - 48
    else:
        summ += val
        val = 0
summ += val
print(summ)
>>278

Java

public static int csum(String s){
    int summ = 0;
    int val = 0;
    int dig;
    for (int i = 0; i < s.length(); i++){
        dig = (int) s.charAt(i);
        if ((dig >= 48) & (dig <= 57))
           val = val * 10 + dig - 48;
        else {
            summ += val; 
            val = 0;
        }   
    }
    summ += val; 
    return summ;
}
public static void main (String[] args) throws java.lang.Exception
{
     System.out.println(csum("3rr0190gg17"));
}
>>210
READ ALSO
Spring Intergration JPA. Обновление сущности в БД

Spring Intergration JPA. Обновление сущности в БД

Есть проект на SpringIntegrationНа jpa:outbound-channel-adapter поступают jpa сущности, которые должны персиститься в БД, если не существует записи с таким Id

152
Ошибка в доступе к открытому методу закрытой переменной

Ошибка в доступе к открытому методу закрытой переменной

Повторяю в точности код из книги Шилдта

127
JAVA - как собирается .jar?

JAVA - как собирается .jar?

Подскажите "обывателю" пожалуйста какой мой ход действий

130
Cannot convert value of type &#39;java.lang.String&#39;

Cannot convert value of type 'java.lang.String'

Читаю Spring in action 5, пытаюсь реализовать примерыНа одном из контроллеров выходит ошибка:

138