我试图找到字符串中存在的数字总和,但代码运行良好并产生错误的输出。
我为该问题编写了以下代码:
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);
"System.in"
接收输入。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
使用 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
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);
您应该使用 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);
}
}