使用递归用两个数字计算 Java 中的字符串表达式
Evaluate string expression in Java with two numbers using recursion
我在将字符串表达式中的正数与负数相乘时遇到问题。
如果我的表达式是 -4*5
那么它是 returns -20 但如果我输入 4*-5
那么它是 returns -5 而不是 -20.
我做了一些调试,发现我的子字符串只提取了 -5 但 * 运算符后面没有数字,所以它返回 0.0
我想在执行表达式之前检查负号并确定它是否为负数。然而,它并没有像预期的那样。
我能得到一些帮助吗?
if (expression.contains("-"))
{
int indexOfExpression = expression.lastIndexOf('-');
String beforeMinus = expression.substring(indexOfExpression-1,indexOfExpression);
if(beforeMinus.equals("*") || beforeMinus.equals("/"))
{
double afterMinus = Double.parseDouble(expression.substring(indexOfExpression,indexOfExpression+2));
return afterMinus;
}else {
double rhs = evaluate(expression.substring(indexOfExpression+1));
return evaluate(expression.substring(0, indexOfExpression)) - rhs;
}
} else if (expression.contains("*")) {
int indexOfExpression = expression.lastIndexOf("*");
Double rhs = evaluate(expression.substring(indexOfExpression + 1));;
return evaluate(expression.substring(0, indexOfExpression)) *rhs;
}
这是我目前拥有的,输出是 -5 而不是 -20。
代码中有很多错误,所以我认为从如何做得更好而不是仅仅调试的角度来回答更有意义。我假设您想对由四个运算符 +
、-
、*
、/
之一分隔的两个数字执行二元运算。主要困难是 -
作为运算符和 -
作为负数符号之间的歧义(在这种情况下,它更像是 -1
的乘法而不是减法)。以下内容并不是万无一失的算法,而是让您了解解决问题的更结构化方法。
class Operator {
public String op;
public int index;
}
Operator findOperator(String expression) {
// Assumes that 'expression' is a simple expression of the form:
// <number><op><number>
// Find all instances of '+', '-', '*', '/'.
// If '-' appears one or more times with another symbol, the other one is
// the operator. If more than one '-' appears, determine which is the
// operator based on position (e.g. can't be the operator at index zero).
return new Operator(...);
}
double calculate(String op, String lhs, String rhs) {
double left = Double.parseDouble(lhs);
double right = Double.parseDouble(rhs);
switch (op) {
case "+":
return left + right;
// etc.
}
}
double calculate(String expression) {
Operator operator = findOperator(expression);
return calculate(
operator.op,
expression.substring(0, operator.index),
expression.substring(operator.index + 1));
}
我在将字符串表达式中的正数与负数相乘时遇到问题。
如果我的表达式是 -4*5
那么它是 returns -20 但如果我输入 4*-5
那么它是 returns -5 而不是 -20.
我做了一些调试,发现我的子字符串只提取了 -5 但 * 运算符后面没有数字,所以它返回 0.0
我想在执行表达式之前检查负号并确定它是否为负数。然而,它并没有像预期的那样。
我能得到一些帮助吗?
if (expression.contains("-"))
{
int indexOfExpression = expression.lastIndexOf('-');
String beforeMinus = expression.substring(indexOfExpression-1,indexOfExpression);
if(beforeMinus.equals("*") || beforeMinus.equals("/"))
{
double afterMinus = Double.parseDouble(expression.substring(indexOfExpression,indexOfExpression+2));
return afterMinus;
}else {
double rhs = evaluate(expression.substring(indexOfExpression+1));
return evaluate(expression.substring(0, indexOfExpression)) - rhs;
}
} else if (expression.contains("*")) {
int indexOfExpression = expression.lastIndexOf("*");
Double rhs = evaluate(expression.substring(indexOfExpression + 1));;
return evaluate(expression.substring(0, indexOfExpression)) *rhs;
}
这是我目前拥有的,输出是 -5 而不是 -20。
代码中有很多错误,所以我认为从如何做得更好而不是仅仅调试的角度来回答更有意义。我假设您想对由四个运算符 +
、-
、*
、/
之一分隔的两个数字执行二元运算。主要困难是 -
作为运算符和 -
作为负数符号之间的歧义(在这种情况下,它更像是 -1
的乘法而不是减法)。以下内容并不是万无一失的算法,而是让您了解解决问题的更结构化方法。
class Operator {
public String op;
public int index;
}
Operator findOperator(String expression) {
// Assumes that 'expression' is a simple expression of the form:
// <number><op><number>
// Find all instances of '+', '-', '*', '/'.
// If '-' appears one or more times with another symbol, the other one is
// the operator. If more than one '-' appears, determine which is the
// operator based on position (e.g. can't be the operator at index zero).
return new Operator(...);
}
double calculate(String op, String lhs, String rhs) {
double left = Double.parseDouble(lhs);
double right = Double.parseDouble(rhs);
switch (op) {
case "+":
return left + right;
// etc.
}
}
double calculate(String expression) {
Operator operator = findOperator(expression);
return calculate(
operator.op,
expression.substring(0, operator.index),
expression.substring(operator.index + 1));
}