我正在评估表达式,我在输入负数时遇到了麻烦。由于我的代码的结构,以及减法运算符和负号是相同的字符的事实,我的代码不适用于负数。有办法解决这个问题吗?
private float evalNoPB(String s) {
float tempAns = 0;
if (s.contains("*") == false && s.contains("/") == false && s.contains("+") == false && s.contains("-") == false) {
return Float.parseFloat(s);
}
if (s.length() - 1 > 0) {
int i;
boolean foundPlusMinus = false;
for (i = s.length() - 1; i > 0; i--) {
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
System.out.println(i);
foundPlusMinus = true;
break; // keep value of i for substrings
}
foundPlusMinus = false;
}
if (foundPlusMinus == false) { // for loop went through and did not find + or -
for (i = s.length() - 1; i > 0; i--) {
if (s.charAt(i) == '*' || s.charAt(i) == '/') {
System.out.println(i);
break; // keep value of i for substrings
}
}
}
String sub1 = s.substring(0, i);
System.out.println(sub1);
String sub2 = s.substring(i + 1, s.length());
System.out.println(sub2);
if (s.charAt(i) == '+') {
tempAns = evalNoPB(sub1) + evalNoPB(sub2);
} else if (s.charAt(i) == '-') {
tempAns = evalNoPB(sub1) - evalNoPB(sub2);
} else if (s.charAt(i) == '*') {
tempAns = evalNoPB(sub1) * evalNoPB(sub2);
} else if (s.charAt(i) == '/') {
float divisorCheck = evalNoPB(sub2);
if (divisorCheck != 0) {
tempAns = evalNoPB(sub1) / evalNoPB(sub2);
} else { // cannot divide by 0
throw new IllegalArgumentException("cannot divide by 0");
}
}
}
return tempAns;
}
答案 0 :(得分:0)
一个解决方法是永远不要'减',只需添加负数(如果你需要减去一些东西,将它乘以-1并将其与另一个数字相加)。
伪代码:
if I come across a - with nothing on either side and not first in string {
add a + to the left of it
}
else {
if first in string {
add 1* to left of it
}
do stuff that has to do with *, /, or +.
}
if i run across a + {
check to see if - is to right of it
if so {
add together the values but with the value to right of - multiplied by -1
}
else {
add together values
}
}
答案 1 :(得分:0)
第一个注意事项是,即使字符串包含减号(“ - ”),也可以将字符串解析为浮点数
所以检查
if (s.contains("*") == false && s.contains("/") == false && s.contains("+") == false && s.contains("-") == false) {
return Float.parseFloat(s);
}
不太对劲。它会跳过像“-10”这样的字符串。而不是我建议
try {
return Float.parseFloat(s);
} catch (NumberFormatException e) {
System.out.println(s + " cannot be parsed to float");
}
我还建议将此解析移到方法的末尾。
第二个评论是关于确定减号是否与减法或负数相关联。 在简单的算术表达式中,您试图解析连接到负数的减号,保留在第一个位置(例如-1 + 14)或者在另一个叹息之后(例如17 * -1) 所以你需要替换循环
for (i = s.length() - 1; i > 0; i--) {
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
System.out.println(i);
foundPlusMinus = true;
break; // keep value of i for substrings
}
foundPlusMinus = false;
}
与
for (i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) == '+' || s.charAt(i) == '-' && (i != 0 && !isSign(s.charAt(i - 1)))) {
System.out.println(i);
foundPlusMinus = true;
break; // keep value of i for substrings
}
foundPlusMinus = false;
}
private boolean isSign(char c) {
return c == '+' || c == '-' || c == '*' || c =='/';
}
请注意,我现在下降到0(i> = 0),如果我们找到减号,我们检查前一个字符(如果存在)不是符号。在这种情况下,它是减法标志。
最后一点是这种递归算法非常幼稚,当括号出现时你需要更复杂的东西。 您可以在此处找到有关高级算法的信息: http://www.sunshine2k.de/coding/java/SimpleParser/SimpleParser.html
答案 2 :(得分:0)
请勿使用负数。改用一元负运算符。因此-23不会是负数-23,而是正数23是“-”一元运算符的参数。