字符串中数字的总和

问题描述 投票:0回答:4

我试图找到字符串中存在的数字总和,但代码运行良好并产生错误的输出。

我为该问题编写了以下代码:

Scanner sc = new Scanner("System.in");
String s = sc.nextLine();
int sumeven = 0;
int sumodd = 0;
for (int i = 0;i < s.length(); i++) {
    int temp = s.charAt(i);
    if ((s.charAt(i) % 2) == 0) {
        sumeven = sumeven+Integer.parseInt(String.valueOf(temp));
    } else if ((s.charAt(i) % 2) != 0) {
        sumodd = sumodd + Integer.parseInt(String.valueOf(temp));
    }
}

System.out.println(sumeven + " " + sumodd);
java string
4个回答
1
投票
  1. 您不是从控制台接收输入,而是从字符串
    "System.in"
    接收输入。
  2. 您在阅读每个字符时就好像它是一个
    int
    ,但事实并非如此。然后,您通过奇偶性对每个
    character
    求和并给出错误的结果。 例如,字符
    S
    在 ASCII 中用十进制表示为
    83
    。因此,作为字符串
    int
    "System.in"
    的每个字符将是
    83 121 115 116 101 109 46 105 110
    ,总和将是
    272 634
    ,这正是您所得到的。

因此,正如评论中提到的,更改为

System.in
以从控制台读取。

然后您需要解析该行,查找

25
中的
"abc25def"
等实际数字,然后转换为
int
并根据奇偶校验对这些数字求和。

一种方法是使用 regex 从字符串中提取数字。

String line = "abc10def21 ghijll 49sks12";
Pattern.compile("\\d+").matcher(s).results()
      .forEach(mr->System.out.println(mr.group()));

打印

10
21
49
12

要对奇数和偶数求和,您可以流式传输这些值,转换为

Integer
,然后通过奇偶校验对它们进行 group 并放入映射中。 总和是使用 Collectors.reducing 计算的。使用上面的
line

Map<String, Integer> map = Pattern.compile("\\d+").matcher(s).results()
        .map(mr -> Integer.valueOf(mr.group()))
        .collect(Collectors.groupingBy(
                v -> v % 2 == 1 ? "Sum of Odds" : "Sum of Evens",
                Collectors.reducing(0, (a, b) -> a + b)));
map.entrySet().forEach(System.out::println);

打印

Sum of Odds=70
Sum of Evens=22

如果您只是对数字求和,那么您不需要正则表达式,只需这样做即可。

  • 使用
    chars()
  • 流式传输字符
  • 过滤掉非数字并转换为
    Integers
  • 然后像以前一样分组。
Map<String, Integer> sumDigits = s.chars()
        .filter(Character::isDigit)
        .mapToObj(Integer::valueOf)
        .collect(Collectors.groupingBy(
                v -> v % 2 == 1 ? "Sum of Odds" : "Sum of Evens",
                Collectors.reducing(0, (a, b) -> a + b)));
sumDigits.entrySet().forEach(System.out::println);

打印

Sum of Odds=204
Sum of Evens=200

0
投票

使用 java 流,您可以找到字符串中的数字总和,如下所示

 String s= "String123";
 Integer sum = IntStream
                    .range(0, s.length())
                    .filter(i -> Character.isDigit(s.charAt(i)))
                    .map(i -> Character.getNumericValue(s.charAt(i)))
                    .sum();
 System.out.println(sum); // output will be 6

0
投票
String text = "Bob get 5000 rubles, Ann - 7563 rubles,  Mary - 30000 rubles";
        int sum = 0;
        String temp = "0";
        //read each character in a String
        for (int i = 0; i< text.length(); i++) {
            //if current character is digit
            if (Character.isDigit(text.charAt(i))) {
                //add this digit to String temp
                temp+=text.charAt(i);
                // if current character is an alphabet
            } else {
                // increment sum by number found earlier
                sum += Integer.parseInt(temp);
                // reset temporary string to empty
                temp="0";
            }
        }
        System.out.println(sum);

-1
投票

您应该使用 new Scanner(System.in) 而不是 new Scanner("System.in")。 这段代码应该可以工作。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int sumeven = 0;
        int sumodd = 0;
        for (int i = 0; i < s.length(); i++) {
            int temp = s.charAt(i) - '0';
            if (temp % 2 == 0) {
                sumeven += temp;
            } else {
                sumodd += temp;
            }
        }
        System.out.println(sumeven + " " + sumodd);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.