检测java中存储为字符串的运算符类型

在Java程序中,我有这些字符串:

a= 8,7,"+" b=1,5,"*" 

每一行都是一个单独的过程。 我想在每一行中,用该运算符计算两个数字。 但我不想使用任何类型的条件系统来检测每行中的哪个运算符。

事实上,我的主要问题是无条件地检测操作员的类型。 我不想使用Javascript引擎。 我想知道有没有任何有效和标准的方法。

J. Selva回应的另一个解决方案:

改进

  1. 单class
  2. 静态块
  3. 更好的抽象

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

 Map map = new HashMap<>(); map.put('+', plusObject); map.put('-', minusObject); map.put('*', multiplyObject); map.put('/', divideObject); 

要获取运算符的对象类型,可以使用map.get(character)它将根据字符返回对象,否则返回null。

更新:为每个类创建四个类和一个对象,即plusObjectminusObjectmultiplyObjectdivideObject 。 这些是您最初添加到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")); 

如果您的问题得到解决,请告诉我们。