Требуется найти сумму всех чисел, входящих в строку.
К примеру, строка abb25bb25. Должно вывестись число 50.
Какими методами можно добиться данного результата?
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());
}
}
}
Для целых неотрицательных чисел можно использовать простой подход. Встретили цифру - "дописали" её к текущему числу, а если не цифру - добавили то, что накопилось, к общей сумме (для оптимизации можно ещё не модифицировать сумму, если "нецифра" уже не первая). Пример на 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть проект на SpringIntegrationНа jpa:outbound-channel-adapter поступают jpa сущности, которые должны персиститься в БД, если не существует записи с таким Id
Читаю Spring in action 5, пытаюсь реализовать примерыНа одном из контроллеров выходит ошибка: