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的操作,使其编译时不会出错。始终在左侧有一个操作员,它将工作。