如何使用评估方法
How to Use Eval Method
我在尝试对字符串求值时遇到问题。我的评估方法是正确的,所以我不打算分享它,但我似乎无法让方法真正达到评估的目的。我一直在尝试所有的事情,似乎我正在获取对象引用,或者它想要的标识符,或者不同的类型(静态与非静态)。
我想知道如何让 eval() 方法起作用。
无论如何,这是代码:
import java.util.Stack;
public class Postfix
{
String expr;
public Postfix(String e)
{
expr = e;
}
public double eval()
{
Stack<Double> stack = new Stack<Double>();
String[] word = expr.split("\s+");
for (int i = 0; i < word.length; i++)
{
double a, b, c;
switch(word[i])
{
case "+":
b = stack.pop();
a = stack.pop();
stack.push(a + b);
break;
default:
stack.push(Double.parseDouble(word[i]));
break;
}
}
return stack.peek();
}
}
规则 #1:如果您的代码不起作用,请不要执行我所做的操作,也不要粘贴它。
答案:添加 .trim() 否则您的字符串将为空然后再次添加另一个 .trim() 否则答案将为 0.0.
String[] word = expr.trim().trim().split("\s+");
好的,您仍然没有 post 异常的堆栈跟踪,尽管这是您的调查应该始终开始的地方,因为它告诉了问题是什么以及它发生的位置。不过,我们有异常消息,我可以从代码中猜出它来自哪里:
Exception: java.lang.NumberFormatException (empty String)
这来自以下行:
stack.push(Double.parseDouble(word[i]));
传递给 parseDouble()
的值应该是一个表示数字的字符串,但它不是。如错误消息所述,它是空字符串。
为什么?使用调试器会很容易地发现问题。您将以下字符串 " 3 4 + "
传递给 expr.split("\s+")
。结果是以下数组(您也可以通过使用 System.out.println(Arrays.toString(word))
打印它来了解):
[, 3, 4, +]
因此它在开头包含一个空字符串,这是由表达式中的额外前导 space 引起的。
将其替换为 "3 4 +"
,或调用 expr.trim().split("\s+");
以确保字符串不包含额外的前导和尾随白色 spaces。
我在尝试对字符串求值时遇到问题。我的评估方法是正确的,所以我不打算分享它,但我似乎无法让方法真正达到评估的目的。我一直在尝试所有的事情,似乎我正在获取对象引用,或者它想要的标识符,或者不同的类型(静态与非静态)。
我想知道如何让 eval() 方法起作用。
无论如何,这是代码:
import java.util.Stack;
public class Postfix
{
String expr;
public Postfix(String e)
{
expr = e;
}
public double eval()
{
Stack<Double> stack = new Stack<Double>();
String[] word = expr.split("\s+");
for (int i = 0; i < word.length; i++)
{
double a, b, c;
switch(word[i])
{
case "+":
b = stack.pop();
a = stack.pop();
stack.push(a + b);
break;
default:
stack.push(Double.parseDouble(word[i]));
break;
}
}
return stack.peek();
}
}
规则 #1:如果您的代码不起作用,请不要执行我所做的操作,也不要粘贴它。
答案:添加 .trim() 否则您的字符串将为空然后再次添加另一个 .trim() 否则答案将为 0.0.
String[] word = expr.trim().trim().split("\s+");
好的,您仍然没有 post 异常的堆栈跟踪,尽管这是您的调查应该始终开始的地方,因为它告诉了问题是什么以及它发生的位置。不过,我们有异常消息,我可以从代码中猜出它来自哪里:
Exception: java.lang.NumberFormatException (empty String)
这来自以下行:
stack.push(Double.parseDouble(word[i]));
传递给 parseDouble()
的值应该是一个表示数字的字符串,但它不是。如错误消息所述,它是空字符串。
为什么?使用调试器会很容易地发现问题。您将以下字符串 " 3 4 + "
传递给 expr.split("\s+")
。结果是以下数组(您也可以通过使用 System.out.println(Arrays.toString(word))
打印它来了解):
[, 3, 4, +]
因此它在开头包含一个空字符串,这是由表达式中的额外前导 space 引起的。
将其替换为 "3 4 +"
,或调用 expr.trim().split("\s+");
以确保字符串不包含额外的前导和尾随白色 spaces。