打印字符串中的数字(不是数字)的总和

时间:2014-01-31 18:23:50

标签: java regex string

我最近被要求在java中编写一个函数,它将对字符串中的数字(不是数字)求和。例如如果字符串是abc35zz400tt15,则输出应为450。

这就是我写的:

 public static void getSum(String a){
        String[] arr=a.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
        int sum=0;
        for(int i=0;i<arr.length;i++){
            if(Pattern.matches("[0-9]+", arr[i]))
        sum+=Integer.parseInt(arr[i]);
    }
    System.out.println(sum);
    }

是否有更有效的方法来执行此操作,因为他们对上述代码不满意。

6 个答案:

答案 0 :(得分:6)

我认为一次只搜​​索一个模式会更简单,而不是分割字符串。

Pattern pattern = Pattern.compile("[0-9]+"); //or you can use \\d if you want
Matcher matcher = pattern.matcher(a);

while(matcher.find()) {
    sum += Integer.parseInt(matcher.group());
}

答案 1 :(得分:5)

如果您期待效率正则表达式匹配和对象分配可能对任务来说是过度的。您可以向后扫描字符串并累积数字:

int currentPower = 1;
int length = string.length();
int value = 0;

for (int i = string.length()-1; i >= 0; --i) {
  char curChar = string.charAt(i);
  if (curChar >= '0' && curChar <= '9') {
    value += (curChar - '0') * currentPower;
    currentPower *= 10;
  }
  else
    currentPower = 1;
}

答案 2 :(得分:2)

快速解决方案,不使用Matcher和Pattern:

    String line = "abc35zz400tt15";
    int sum = 0;

    String[] numbers = line.split("\\D");
    for (String digit : numbers) {
        if (digit.length() > 0) sum += Integer.valueOf(digit);
    }

答案 3 :(得分:1)

替代解决方案:使用+符号替换不是数字的所有内容,并评估结果。这在Java中效率不高,但还有其他实例(例如bash),这是正确的做法。所以我把这个建议放在这里“为未来的访客”。

澄清:我的意思是

echo abc35zz400tt15 | sed -E 's/[^0-9]+/\+/g' | sed 's/^\+//' | bc

那是

find one or more characters that are not a digit
replace all of them with a +
then strip the first `+` if it's the first character in the line
and evaluate the result

以上产量

450

正如所料。

注意 - 当您提供的字符串以bc开头时,+不喜欢它 - 因此需要第二个sed

注2 - 在Mac OSX上使用-E标志来设置“扩展正则表达式”。这给+字符赋予了特殊含义('一个或多个') - 比\{1,}\}更短......我知道Mac与gnu字符略有不同,但不是'我知道这是否是其中一种情况。

答案 4 :(得分:1)

如果您喜欢Java 8,可以用相当有表现力的方式编写它:

int sum = Arrays.stream(input.split("\\D+"))
             .filter(s -> ! s.isEmpty())
             .mapToInt(Integer::parseInt)
             .sum();

答案 5 :(得分:-2)

编辑:: 哎呀,读得太快,你想要数字,而不是数字。我相信有人已经回答过上述问题。我也用我原来的(但不正确的)方法回答了这个问题

上一个答案

看看Java的isDigit(char c)。它可能看起来像:

public static void getSum(string a) {
    int sum = 0;
    for(int i = 0; i < a.length(); i++) {
        if(Character.isDigit(a.charAt(i))) {
            sum += Integer.parseInt(a.charAt(i));
        }
    }
    System.out.println(sum);
}

使用迭代方法的新答案

public static void getSum(String a) {
    int sum = 0;
    String num = "";
    for(int i = 0; i < a.length(); i++) {
        if(Character.isDigit(a.charAt(i))) {
            num = num + a.charAt(i);
        } else {
            if(!num.equals("")) {
                sum = sum + Integer.parseInt(num);
                num = "";
            }
        }
    }
    if(!num.equals("")) {
        sum = sum + Integer.parseInt(num);
    }
    System.out.println(sum);
}