Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算代码,区分负数和负数?_Java_Evaluate - Fatal编程技术网

Java 计算代码,区分负数和负数?

Java 计算代码,区分负数和负数?,java,evaluate,Java,Evaluate,我正在计算一个表达式,输入负数时遇到了麻烦。由于我的代码的结构,以及减法运算符和负号是同一个字符的事实,我的代码不适用于负数。有办法解决这个问题吗 private float evalNoPB(String s) { float tempAns = 0; if (s.contains("*") == false && s.contains("/") == false && s.contains("+") == false && s

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

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;

}

一个解决办法是永远不要“减”,只要加上负数(如果你需要减去某个数字,就把它乘以-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,再加上另一个数字)

伪代码:

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
    }
}

第一句话是,即使字符串包含减号(“-”),也可以将其解析为float

所以检查

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;
 }

请注意,我现在降到0(i>=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;
 }

请注意,我现在降到0(i>=0),如果我们找到减号,我们将检查前一个字符(如果存在)是否不是符号。在这种情况下,它是减法符号

最后一点是,这种递归算法非常幼稚,当括号出现时,您将需要更复杂的东西。 您可以在此处找到有关高级算法的信息,例如:
不要使用负数。改用一元减号运算符。所以-23不是负数-23,而是正数23作为“-”一元运算符的参数。

不要使用负数。改用一元减号运算符。所以-23不是负数-23,而是正数23作为“-”一元运算符的参数。

您能更清楚地说明您的问题吗?!!!此代码对字符串表达式求值。它适用于
3*4+5
等字符串,但不适用于
-3*4+5
等字符串,因为负号被视为减法运算符。这就是我需要解决的问题,抛开它,查找“递归下降表达式解析器”或Dijkstra调车场算法。从这里你永远也到不了那里。你能更清楚你的问题吗?!!!此代码对字符串表达式求值。它适用于
3*4+5
等字符串,但不适用于
-3*4+5
等字符串,因为负号被视为减法运算符。这就是我需要解决的问题,抛开它,查找“递归下降表达式解析器”或Dijkstra调车场算法。因此,每当我遇到一个
-
时,我需要根据情况将字符串中的下一个项替换为负值。除非您想设置另一个值来表示负数,否则您要假装不能减去数字,您所能做的就是加、乘、除。我加入了一些伪代码,可以解释我所说的背后的逻辑,但是你需要检查符号周围的东西,知道如何处理它。我喜欢考虑的一个好方法是使它尽可能在数学上简单。如果您有-3*4+5-9,您可以执行类似于1*-3*4+-9的操作,使其编译时不会出错。始终在-的左边有一个运算符,它会起作用。因此,每当遇到
-
时,我需要根据情况将字符串中的下一个项替换为负值。除非您想设置另一个值来表示负数,否则您要假装不能减去数字,您所能做的就是加、乘、除。我加入了一些伪代码,可以解释我所说的背后的逻辑,但是你需要检查符号周围的东西,知道如何处理它。我喜欢考虑的一个好方法是使它尽可能在数学上简单。如果您有-3*4+5-9,您可以执行类似于1*-3*4+-9的操作,使其编译时不会出错。始终在左侧有一个操作员,它将工作。