一尘不染

检测以字符串形式存储在java中的运算符的类型

java

在Java程序中,我具有以下字符串:

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

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

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


阅读 189

收藏
2020-12-03

共1个答案

一尘不染

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

改进之处

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

导入java.util.HashMap; 导入java.util.Map;

/**
 * Created by SEA-HAWK on 23/8/15.
 */
public abstract class Expr {
    public static Map<String,Object> 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]));
    }
}

主功能:

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

注意:更改数据类型以进行浮点/小数计算。

2020-12-03