我在Java中有一项奇怪的任务。 不使用任何循环和if语句我必须开发简单的计算器,它在一个字符串中定义所有操作和数字,如:“126.7214 + 121” 我使用正则表达式来解析字符串并获得3个字符串变量['125.7214','+','121'],通常我会做if语句,parseString为整数,并且if if语句基于数学符号来对这些数字求和,但是我倾斜。 Java中有什么技巧可以更快地完成它吗?一些准备好的图书馆? 我很感激任何建议。 :代码:
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Calc {
public String doCalc(String cmd) {
Matcher m = Pattern.compile("\\S+").matcher(cmd);
m.find();
String num1= m.group(0);
m.find();
String znak = m.group(0);
m.find();
String num2 = m.group(0);
return result;
}
}
答案 0 :(得分:3)
JavaScript解析器适用于表达式。
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
public class Expression{
public static void main(String[] args){
ScriptEngineManager script = new ScriptEngineManager();
ScriptEngine eng = mgr.getEngineByName("JavaScript");
System.out.println(eng.eval("5+5*5"));
}
}
答案 1 :(得分:2)
答案 2 :(得分:0)
您可以使用Spring的SPeL来评估您的价值观。 SPeL代表Spring Expression Language。它允许您评估用Java编写的String。以下行是您可以在表达式中评估的示例。我想你可以简单地将你的值放在表达式中以获得值。当然,这并不是完全适用于所有依赖项。这个例子只是向您展示一个简单的示例,向您展示它。
//From www.mkyong.com
Expression exp2 = parser.parseExpression("'Hello World'.length()");
当然,您可以参考Spring站点,以了解有关如何使用依赖项创建Spring项目以及完全刷新的几个示例的更多信息。我从mkyong网站收到了这个小片段。
http://www.mkyong.com/spring3/test-spring-el-with-expressionparser/
答案 3 :(得分:0)
这是一种利用多态的方法(因为你已经知道如何解析操作数,因为我本人的懒惰,我已经把那部分留下了):
import java.util.*;
public class CalcProofOfConcept {
public static abstract class Arithmetic { public abstract double apply(double x, double y); }
public static class Add extends Arithmetic { public double apply(double x, double y) { return x+y; } }
public static class Subtract extends Arithmetic { public double apply(double x, double y) { return x-y; } }
public static class Multiply extends Arithmetic { public double apply(double x, double y) { return x*y; } }
public static class Divide extends Arithmetic { public double apply(double x, double y) { return x/y; } }
public static void main(String []args){
Map<String, Arithmetic> operators = new HashMap<String, Arithmetic>();
operators.put("+", new Add());
operators.put("-", new Subtract());
operators.put("*", new Multiply());
operators.put("/", new Divide());
double x = 125.7214;
double y = 121;
String op = "+";
System.out.println(operators.get(op).apply(x,y));
}
}
这会打印246.72140000000002
。
顺便说一句:实际的算术表达式是context-free language,因此除了最简单的表单之外,使用正则表达式解析它们将不起作用。例如,一旦混合加法和乘法,基于正则表达式的计算器就会给出错误的结果,因为它不能尊重运算符优先级。
PS:是的,我知道这是用大锤打破坚果但是我觉得这样做很酷...