java在字符串中首先计算负数运算
我已经写了我能想到的所有可能的代码组合,但是如果先有一个负运算符,我的计算器就不能工作
计算器的工作方式是,如果已经包含一个运算符(字符串的最后一个字符是数字),它将首先计算已经存在的内容,然后添加已按下的运算符。但是,我希望它允许和第二个运算符当且仅当第一个字符是负数(-symbol)时。但我这辈子不能这么做。这就是我到目前为止所做的:
// calculation logic
public void calculate() {
for (int i = 0; i < textField.length(); i++) {
checkOp(i);
}
resultDisplayed = true;
}
public float checkOp(int i) {
if (textField.getText().charAt(i) == '+') {
result = Float.parseFloat(textField.getText().toString().substring(0, i)) + Float.parseFloat(textField.getText().toString().substring(i + 1, textField.length()));
returnAnswer(decimalFormat.format(result));
} else if (textField.getText().charAt(i) == '-') {
if (textField.getText().charAt(0) != '-') {
result = Float.parseFloat(textField.getText().toString().substring(0, i)) - Float.parseFloat(textField.getText().toString().substring(i + 1, textField.length()));
} else {
}
} else if (textField.getText().charAt(i) == '*') {
result = Float.parseFloat(textField.getText().toString().substring(0, i)) * Float.parseFloat(textField.getText().toString().substring(i + 1, textField.length()));
returnAnswer(decimalFormat.format(result));
} else if (textField.getText().charAt(i) == '/') {
result = Float.parseFloat(textField.getText().toString().substring(0, i)) / Float.parseFloat(textField.getText().toString().substring(i + 1, textField.length()));
returnAnswer(decimalFormat.format(result));
}
return result;
}
// checks if last character is one of the operands (not -)
public void checkLastOp(String op) {
if (textField.length() == 0 & op.equals("-")) {
addToOutput("-");
} else if (textField.length() > 0) {
if (op.equals("+")) {
if (textField.getText().toString().contains("+") || textField.getText().toString().contains("-") || textField.getText().toString().contains("*") || textField.getText().toString().contains("/")) {
if (Character.isDigit(textField.getText().charAt(textField.length() - 1)) && textField.getText().charAt(0) != '-') {
calculate();
} else {
if (!Character.isDigit(textField.getText().charAt(textField.length() - 1))) {
textField.getText().delete(textField.getText().length() - 1, textField.getText().length());
}
}
}
addToOutput("+");
} else if (op.equals("-")) {
if (textField.getText().toString().contains("+") || textField.getText().toString().contains("-") || textField.getText().toString().contains("*") || textField.getText().toString().contains("/")) {
if (Character.isDigit(textField.getText().charAt(textField.length() - 1))) {
calculate();
} else if (textField.getText().charAt(textField.length() - 1) == '+' || textField.getText().charAt(textField.length() - 1) == '-') {
textField.getText().delete(textField.getText().length() - 1, textField.getText().length());
}
}
addToOutput("-");
} else if (op.equals("*")) {
if (textField.getText().toString().contains("+") || textField.getText().toString().contains("-") || textField.getText().toString().contains("*") || textField.getText().toString().contains("/")) {
if (Character.isDigit(textField.getText().charAt(textField.length() - 1))) {
calculate();
} else {
textField.getText().delete(textField.getText().length() - 1, textField.getText().length());
}
}
addToOutput("*");
} else if (op.equals("/")) {
if (textField.getText().toString().contains("+") || textField.getText().toString().contains("-") || textField.getText().toString().contains("*") || textField.getText().toString().contains("/")) {
if (Character.isDigit(textField.getText().charAt(textField.length() - 1))) {
calculate();
} else {
textField.getText().delete(textField.getText().length() - 1, textField.getText().length());
}
}
addToOutput("/");
}
}
}
当按下+、-、*、或/并通过方法传递相应的运算符时,将调用CheckLastOp
用我的计算方法,我试着检查-是否是第一个字符,它是否正常进行,是否从第二个值开始计算,并从零减去答案
编辑:我想我已经发现了它崩溃的原因。在我的计算方法中,如果第一个字符是i,我停在0,然后它计算从1到i,从1到0,这是一个完全混乱的过程。现在我需要一种从1到下一个字符的方法,这意味着再次调用calculate,但不确定如何执行此操作
重新编写计算逻辑以进行整理
编辑2:解决了它,更新了我的代码以显示我的解决方案
# 1 楼答案
我不明白你为什么需要递归解决方案。在问题陈述中,您说当用户按下第二个运算符时,您首先计算现有表达式,然后添加第二个运算符。应该不需要对checkOp(j)进行递归调用。注:第一个“-”不是运算符,而是表示负数并将其视为负数的符号
这是因为,除非您试图允许使用括号“[”,“(”,“{”),在这种情况下,表达式的计算要复杂得多
# 2 楼答案
除了其他评论者强调的小错误之外,我认为我在这里遗漏了一些东西。您试图构建的是一个表达式解析器,它通常是用lexer和parser构建的
如果您尝试自己编写,使用嵌套的ifs,您可能会错过一些关键案例,或者在单元测试中花费大量时间
这里的好消息是Java默认支持使用JDK1.6+中内置的Javascript引擎进行表达式求值
以下是一个片段,您可以轻松适应您的情况:
用你的表情试试看:
请查看ScriptEngine类,了解如何处理返回值以及如何根据需要修改我的eval函数