我正在应对一项挑战,要求我们输入包含数字的字符串。例如,“这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);
}
我不知道如何将此代码与可以将此方法输出的数字相加的代码组合。
答案 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;
}
}
}