评估代码,区分减号和负号?

时间:2015-10-15 21:39:30

标签: java evaluate

我正在评估表达式,我在输入负数时遇到了麻烦。由于我的代码的结构,以及减法运算符和负号是相同的字符的事实,我的代码不适用于负数。有办法解决这个问题吗?

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;

}

3 个答案:

答案 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是“-”一元运算符的参数。