检测java中存储为字符串的运算符类型
在Java程序中,我有这些字符串:
a= 8,7,"+" b=1,5,"*"
每一行都是一个单独的过程。 我想在每一行中,用该运算符计算两个数字。 但我不想使用任何类型的条件系统来检测每行中的哪个运算符。
事实上,我的主要问题是无条件地检测操作员的类型。 我不想使用Javascript引擎。 我想知道有没有任何有效和标准的方法。
J. Selva回应的另一个解决方案:
改进
- 单class
- 静态块
- 更好的抽象
import java.util.HashMap; import java.util.Map;
/** * Created by SEA-HAWK on 23/8/15. */ public abstract class Expr { public static Map op; static{ op=new HashMap<>(); op.put("+", new Expr() { @Override public int evaluate(int a, int b) { return a + b; } }); op.put("-", new Expr() { @Override public int evaluate(int a, int b) { return a - b; } }); op.put("*", new Expr() { @Override public int evaluate(int a, int b) { return a * b; } }); op.put("/", new Expr() { @Override public int evaluate(int a, int b) { return a / b; // decimal point loss } }); } abstract public int evaluate(int a, int b); public static int exprEval(String expr){ String a[]=expr.split(","); a[2]=a[2].replaceAll("\"",""); return ((Expr)op.get(a[2])).evaluate(Integer.parseInt(a[0]),Integer.parseInt(a[1])); } }
主function:
public static void main(String[] args) { String x="20,10,\"*\""; System.out.println(x+"="+Expr.exprEval(x)); x="20,10,\"+\""; System.out.println(x+"="+Expr.exprEval(x)); x="20,10,\"-\""; System.out.println(x+"="+Expr.exprEval(x)); x="20,10,\"/\""; System.out.println(x+"="+Expr.exprEval(x)); }
输出:
20,10,"*"=200 20,10,"+"=30 20,10,"-"=10 20,10,"/"=2
注意:更改浮点/小数值计算的数据类型。
首先拆分字符串并将运算符存储在Character变量中。 您可以使用split()
拆分String并将其分配给String数组。 使用数组索引访问运算符并将其分配给Character变量。
现在,您可以使用Map
,您可以在其中存储字符和对象,以便在单个结构中进行计算,稍后只使用字符进行访问,而无需任何if-else
或switch
。
Map map = new HashMap<>(); map.put('+', plusObject); map.put('-', minusObject); map.put('*', multiplyObject); map.put('/', divideObject);
要获取运算符的对象类型,可以使用map.get(character)
它将根据字符返回对象,否则返回null。
更新:为每个类创建四个类和一个对象,即plusObject
, minusObject
, multiplyObject
, divideObject
。 这些是您最初添加到HashMap
的对象。 在每个类中都有一个evaluate()
函数。 现在使用返回的对象,调用evaluate()
方法,该方法将调用相应的类。 您无需使用任何条件语句检查Object
类型。
您可以将后缀表达式转换为中缀数学表达式,并使用Java或javascript(不是首选)中的表达式赋值器执行它。 正如您推荐的java,以下链接将帮助您:
评估-A-数学表达式给出的式串forms
java的解析-A-数学表达式给出的作为一种串及返回一个数
从以上两个链接回答:
您可以将它传递给BeanShell bsh.Interpreter,如下所示:
Interpreter interpreter = new Interpreter(); interpreter.eval("result = 5+4*(7-15)"); System.out.println(interpreter.get("result"));
如果您的问题得到解决,请告诉我们。