java—拆分数字时将空字符串添加到字符串数组

qcuzuvrc  于 2021-07-08  发布在  Java
关注(0)|答案(4)|浏览(309)

这个问题在这里已经有答案了

如何防止java.lang.string.split()创建前导空字符串(9个答案)
上个月关门了。
我现在正试图用codebat为大学复习java。我的目标是获取一个包含任意ascii字符的字符串,从该字符串中拆分所有数字,然后将所有数字的和作为int返回。
例如: foo("123xyz") 应该返回123和 foo("12cd43ad") 应该返回55
这是我的密码:

public int sumNumbers(String str) {
  int sum = 0;

  String[] numArr = str.split("\\D+"); //This is my attempted regex
  for (String num: numArr) {
    sum += Integer.parseInt(num);
  }

  return sum;
}

当我跑的时候 sumNumbers("123xyz") 或者 sumNumbers("aa11b33") ,我得到这个错误: NumberFormatException: For input string: "" 为什么在我的numar中有一个空字符串,什么是合适的正则表达式来解决这个问题?

zed5wv10

zed5wv101#

检查以下文件中的行 String#split :
如果此字符串的开头有正宽度匹配,则结果数组的开头将包含一个空的前导子字符串。但是,开头的零宽度匹配永远不会产生这样的空前导子串。
您可以通过打印结果数组来确认它。空字符串不能解析为 int . 解决方法是忽略无法解析为 int .

public class Main {
    public static void main(String[] args) {
        // Tests
        System.out.println(sumNumbers("abc123xyz"));
        System.out.println(sumNumbers("12cd43ad"));
    }

    public static int sumNumbers(String str) {
        int sum = 0;

        String[] numArr = str.split("\\D+");
        //System.out.println(Arrays.toString(numArr));
        for (String num : numArr) {
            try {
                sum += Integer.parseInt(num);
            } catch (NumberFormatException e) {
                // Ignore the strings which can not be parsed into int
            }
        }

        return sum;
    }
}

输出:

123
55
mklgxw1f

mklgxw1f2#

可能需要在 split("\\D+") 通过非数字序列。
此外,流api可用于计算和:

public static int sumNumbers(String str) {
    return Arrays.stream(str.split("\\D+"))   // Stream<String>
                 .filter(s -> !s.isEmpty())   // remove empty strings 
                 .mapToInt(Integer::parseInt) // get IntStream (stream of primitive int)
                 .sum();
}

测试:

System.out.println(sumNumbers("abc123z-3yx"));   // 123 + 3
System.out.println(sumNumbers("12abc34z-6yx"));  // 12 + 34 + 6

输出:

126
52

类似地,一种匹配数字序列的模式 "-?\\d+" (含选配) -? 为了处理负值),可以使用:

public static int sumNumbers(String str) {
    Pattern p = Pattern.compile("-?\\d+");
    return p.matcher(str)
            .results()                   // Stream<MatchResult> since Java 9
            .map(MatchResult::group)     // get the matched sequence as string
            .mapToInt(Integer::parseInt) // get primitive int
            .sum();
}

相同试验数据的结果:(123-3)和(12+34-6)

120
40
vaqhlq81

vaqhlq813#

您将在非数字上进行拆分,除非第一个字符是数字,否则您将得到一个空字符串,因为根据javadoc,这是正确的行为https://docs.oracle.com/javase/8/docs/api/java/lang/string.html#split-java.lang.string-int文件-
函数在以数字作为第一个字符的字符串上运行良好。

svujldwt

svujldwt4#

matcher更适用于此目的,然后拆分:

int sum = 0;
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(str);
while(m.find()) {
    sum+=Integer.parseInt(m.group());
}
return sum;

相关问题