如何编写将字符串中每个数字的数字相加的Java方法

时间:2019-05-26 03:57:18

标签: java

我正在应对一项挑战,要求我们输入包含数字的字符串。例如,“这23个字符串有738个数字”

该方法需要将2 + 3的值相加以返回5,将7 + 3 + 8的值相加以返回18。

但是我不知道如何循环查找输入字符串中的每个数字,执行该操作,并继续遍历字符串的其余部分。有什么建议或解决方案吗?

成功的方法将字符串作为输入,例如“此23字符串具有34或cat 48”,并且该方法将返回5、7和12。

我已经弄清楚了如何使用正则表达式从字符串中挑出数字,但是我不知道如何将每个挑出的数字添加到输出中

package reverseTest;

import java.util.Scanner;
public class ExtractNumbers {`enter code here`
      public static void main(String[] args) 
      {
          String str;
          String numbers;

          Scanner SC=new Scanner(System.in);

          System.out.print("Enter string that contains numbers: ");
          str=SC.nextLine();

          //extracting string
          numbers=str.replaceAll("[^0-9]", "");

          System.out.println("Numbers are: " + numbers);
      }
}

这会将所有数字添加到字符串中:

String a="jklmn489pjro635ops";

    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 = "";
            }
        }
    }
    System.out.println(sum);
}

我不知道如何将此代码与可以将此方法输出的数字相加的代码组合。

3 个答案:

答案 0 :(得分:4)

我们可以尝试使用Java的正则表达式引擎,其模式为\d+。然后,我们可以逐个字符地迭代每个匹配的字符,并求和。

String a = "This 23 string has 738 numbers";
String pattern = "\\d+";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(a);
while (m.find()) {
    System.out.print("found numbers: " + m.group(0) + " = ");
    int sum = 0;
    for (int i=0; i < m.group(0).length(); ++i) {
        sum += m.group(0).charAt(i) - '0';
    }
    System.out.println(sum);
}

此打印:

found numbers: 23 = 5
found numbers: 738 = 18

答案 1 :(得分:1)

您可以简单地split输入字符串以具有单独的令牌,然后split每个令牌仅具有数字:

String s = "This 23 string has 738 numbers";
String[] st = s.split(" ");
for (int i=0 ; i<st.length ; i++) {
    if (st[i].matches("[0-9]+")) {
        String[] c = st[i].split("(?=\\d)");
        int sum = 0;
        for(int j=0 ; j<c.length ; j++) {
            sum += Integer.parseInt(c[j]);
        }
        System.out.println(sum);

    }
}

输出为:

5
18

答案 2 :(得分:1)

在中断了20年之后,我正在重新学习Java,并同时评估BlueJ以便在我的教室中使用。这似乎是一个很棒的练习项目,因此感谢您的帖子!这是我的看法,不使用正则表达式。

FindDigits类:

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class FindDigits
{

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        System.out.print("Enter string to analyze: ");
        String input = scan.nextLine();

        FindDigits fd = new FindDigits(input);
        System.out.println("Input: " + fd.getInput());
        List<NumberSum> results = fd.getSums();
        if (results.size() > 0)
        {
            for(NumberSum ns: results)
            {
                System.out.println("Number: " + ns.getNumber() + ", Sum: " + ns.getSum());
            }
        }
        else
        {
            System.out.println("No numbers found.");
        }
    }

    private String _input;
    public String getInput()
    {
        return _input;
    }

    public FindDigits(String input)
    {
        _input = input;
    }

    private List<String> getNumbers()
    {
        List<String> numbers = new ArrayList();
        String curNumber = "";
        for(Character c: getInput().toCharArray())
        {
            if(Character.isDigit(c))
            {
                curNumber = curNumber + c;
            }
            else
            {
                if (!curNumber.isEmpty())
                {
                    numbers.add(curNumber);
                    curNumber = "";
                }
            }
        }
        if (!curNumber.isEmpty())
        {
            numbers.add(curNumber);
        }
        return numbers;
    }

    public List<NumberSum> getSums()
    {
        List<NumberSum> sums = new ArrayList<NumberSum>();
        for(String number: getNumbers())
        {
            sums.add(new NumberSum(number));
        }
        return sums;
    }

}

Class NumberSum:

public class NumberSum
{

        private String _number;
        public String getNumber()
        {
            return _number;
        }

        public NumberSum(String number)
        {
            _number = number;
            for(char c: number.toCharArray())
            {
                if(!Character.isDigit(c))
                {
                    _number = "";
                    break;
                }
            }
        }

        public int getSum()
        {
            return sum(getNumber());
        }

        private int sum(String number)
        {
            if (!getNumber().isEmpty())
            {
                int total = 0;
                for(char c: number.toCharArray())
                {
                    total = total + Character.getNumericValue(c);
                }
                return total;
            }
            else
            {
                return -1;   
            }
        }

}

输出: enter image description here