如何从给定的字符串中“分隔”一个整数?
Posted
技术标签:
【中文标题】如何从给定的字符串中“分隔”一个整数?【英文标题】:How can I "delimit" an integer from a given string? 【发布时间】:2012-11-30 20:31:47 【问题描述】:我正在做一个练习,我必须从键盘输入一个字符串。该字符串将是简单的算术运算,例如“2 + 4 + 6 - 8 + 3 - 7”。是的,格式必须是这样的。中间有一个空格。
我们的想法是获取这个字符串并最终打印出它的答案。到目前为止,这是我的代码:
public class AddemUp
public static void main(String[] args)
Scanner kb = new Scanner(System.in);
System.out.print("Enter something like 8 + 33 + 1345 + 137: ");
String s = kb.nextLine();
Scanner sc = new Scanner(s);
sc.useDelimiter("\\s*\\+\\s*|\\s*\\-\\s*");
int sum = 0;
int theInt;
Scanner sc1 = new Scanner(s);
sc1.useDelimiter("\\s*\\s*");
String plusOrMinus = sc1.next();
int count = 0;
if(s.startsWith("-"))
sum -= sc.nextInt();
while(sc.hasNextInt())
theInt = sc.nextInt();
if(count == 0)
sum += theInt;
else if(plusOrMinus.equals("+"))
sum += theInt;
else
sum -= theInt;
sc1.next();
count++;
System.out.println("Sum is: " + sum);
在“sc1.delimiter”所在的第 25 行,我不知道如何让代码跳过所有整数(连同空格)并仅隔离“+”或“-”。实现这一点后,我可以简单地将其实现到 while 循环中。
【问题讨论】:
使用shunting-yard algorithm 这个问题可能会有所帮助,因为它试图 remove 字符串中的所有数字,我认为您会发现这与使用数字作为分隔符 ***.com/questions/41505028/… 非常相似 【参考方案1】:如果你想消除数字,留下一个操作数数组,分割字符其他而不是加号或减号:
String[] ops = str.split("[^+-]+");
fyi,当减号在字符类中的第一个或最后一个时,它是一个字面减号(否则它是一个范围)
【讨论】:
【参考方案2】:尝试改用split()
(JavaDoc) 方法。这要容易得多。
"8 + 33 + 1345 + 137".split("\\+|\\-")
应该返回一个带有数字的数组。
【讨论】:
我知道 split() 方法,但是我不想隔离等式中的数字。事实上,我已经使用扫描仪“sc”的分隔符完成了这项工作。我需要隔离的是运算符符号“+”和“-”。我需要消除这些数字。【参考方案3】:你可以使用下面的代码
"8 + 33 + 1345 + 137".split("(\\s\\d*\\s)|(\\s\\d*)|(\\d*\\s)")
这里的正则表达式检查字符串中的数字以及它之前/之后/周围的空格。
这个拆分返回数组[, +, +, +]
除非字符串以 +/- 开头,否则第一位将始终为空,您可以从 [1] 位置访问数组
【讨论】:
【参考方案4】:我不会为此使用 Scanner,我会使用模式匹配。它们的相反之处在于扫描程序需要在您想要的字符之间使用分隔符,而模式匹配则标识您想要的字符。
要找到您可以拥有的运算符...
Pattern p = Pattern.compile("[+-]");
Matcher m = p.matcher("2 + 4 + 6 - 8 + 3 - 7");
while (m.find())
String token = m.group(0);
System.out.println(token);
当数字和运算符一起在循环中时,逻辑可以直接处理。这就是为什么我包括这个。
Pattern p = Pattern.compile("([^\\s]+)(?:\\s+|$)");
Matcher m = p.matcher("2 + 4 + 6 - 8 + 3 - 7");
while (m.find())
String token = m.group(1);
System.out.println(token);
regex101 是一个测试正则表达式的好站点。
【讨论】:
【参考方案5】:试试这个:
String str = ...
int total = 0;
int operand;
for(int i = 0; i < str.length(); i++)
if(Character.isWhiteSpace(str.charAt(i)))
; // empty
else if(Character.isDigit(str.charAt(i)))
StringBuilder number = new StringBuilder();
while(Character.isDigit(str.charAt(i)))
number.append(str.charAt(i));
i++;
operand = Integer.parseInt(number.toString);
else if(str.charAt(i)) == '+')
total += operand;
else if(str.charAt(i)) == '-)
total -= operand;
else
throw new IllegalArgumentException();
当然,您应该更好地检查非法条目。我刚刚给你的想法。
【讨论】:
你的程序中有很多 CTE,比如operand
可能没有初始化,number.toString
中缺少括号,s
在 isWhiteSpace
中应该很小,最终输出将 IndexOutOfBoundException
【参考方案6】:
下面的代码可以只计算运算符'+'和'-'的序列 希望对你有帮助
public class test1
public static void main(String[] args)
String s= "9-15";
s=s+"/"; /* add / to execute the last operation */
String split[]= new String[s.length()];
for (int i=0;i<split.length;i++) /* split the string to array */
split[i]=s.substring(i,i+1);
String val1="",op="+"; /* val1 : container of the value before the operator to calculate it with total
op : the operator between val1 and val2 at the begin is + */
int som=0;
for (int i=0;i<split.length;i++)
try
val1=val1+Integer.parseInt(split[i]); /* saving the number after the operation in a string to calculate it,
a number format exception is throwing when the case don't contain integer*/
catch(NumberFormatException e)
if(op.equals("+"))
som=som+Integer.parseInt(val1); /*calculate the total */
val1=""; /*initialize val1 to save the second number */
op=split[i]; /* save the operator of the next operation */
else
if(op.equals("-"))
som=som-Integer.parseInt(val1);
val1="";
op=split[i];
System.out.println(som);
【讨论】:
只说“这里是您问题的解决方案”的答案并不好,因为它们在帮助 OP 学习和改进方面做得不好。此外,OP 可能希望有人向他们提供解决方案,而只是希望朝着正确的方向轻推,以便他们可以自己实施解决方案。【参考方案7】:int total = 0;
final String s = "9 - 15";
final String[] arr = s.split(" ");
int i = 0;
while (i != arr.length)
switch (arr[i])
case ("+"):
total += Integer.parseInt(arr[++i]);
break;
case ("-"):
total -= Integer.parseInt(arr[++i]);
break;
case ("*"):
total *= Integer.parseInt(arr[++i]);
break;
case ("/"):
total /= Integer.parseInt(arr[++i]);
break;
default:
total = Integer.parseInt(arr[i++]);
if (i == arr.length - 1)
break;
System.out.println(total);
希望这对你有帮助....thnx
【讨论】:
似乎这会将 6 + 2 / 2 回答为 4 而不是 7 只说“这里是您问题的解决方案”的答案并不好,因为它们在帮助 OP 学习和改进方面做得不好。此外,OP 可能希望有人向他们提供解决方案,而只是希望朝着正确的方向轻推,以便他们可以自己实施解决方案。【参考方案8】:给你,希望对你有帮助...
您即将看到的代码可以求解所有基本方程,这意味着它可以求解仅包含.
、+
、-
、*
和/ 或 /
等式中的符号。此等式还可以加、减、倍数和/或除小数。这无法求解包含x^y
、(x)
、[x]
等的方程。
public static boolean isNum(String e)
String[] num=new String[] "1", "2", "3", "4", "5", "6", "7", "8", "9", "0";
boolean ret=false;
for (String n : num)
if (e.contains(n))
ret=true;
break;
return ret;
public static boolean ifMax(String[] e, int i)
boolean ret=false;
if (i == (e.length - 1))
ret=true;
return ret;
public static String getResult(String equation)
String[] e=equation.split(" ");
String[] sign=new String[] "+", "-", "*", "/";
double answer=Double.parseDouble(e[0]);
for (int i=1; i<e.length; i++)
if (isNum(e[i]) != true)
if (e[i].equals(sign[0]))
double cc=0;
if (ifMax(e, i) == false)
cc=Double.parseDouble(e[i+1]);
answer=answer+(cc);
else if (e[i].equals(sign[1]))
double cc=0;
if (ifMax(e, i) == false)
cc=Double.parseDouble(e[i+1]);
answer=answer-(cc);
else if (e[i].equals(sign[2]))
if (ifMax(e, i) == false)
answer=answer*(Double.parseDouble(e[i+1]));
else if (e[i].equals(sign[3]))
if (ifMax(e, i) == false)
answer=answer/(Double.parseDouble(e[i+1]));
return equation+" = "+answer;
这是一个例子:
输入:
System.out.println(getResult("1 + 2 + 3 + 4 / 2 - 3 * 6"));
输出:
1 + 2 + 3 + 4 / 2 - 3 * 6 = 12
【讨论】:
只说“这里是您问题的解决方案”的答案并不好,因为它们在帮助 OP 学习和改进方面做得不好。此外,OP 可能希望有人向他们提供解决方案,而只是希望朝着正确的方向轻推,以便他们可以自己实施解决方案。以上是关于如何从给定的字符串中“分隔”一个整数?的主要内容,如果未能解决你的问题,请参考以下文章