【问题标题】:Evaluate math expression but given variables instead of numbers评估数学表达式,但给定变量而不是数字
【发布时间】:2015-07-09 20:24:42
【问题描述】:

市面上有很多数学表达式求值器,但它们求值的值类似于 (1 + 2)/3,等等。但我需要评估包含变量的表达式(在java中)。例如,如果程序有两个变量int a = 1; int b = 2;,如果我将(a + b)/a 之类的东西作为String 传递给方法,它应该返回结果为3,实际上是(1+2)/1。实际上公式/表达式来自配置文件。

编辑:刚刚发现了一个类似的问题Evaluating math expression on dictionary variables,但需要java中的解决方案

【问题讨论】:

  • 我很困惑。那行代码是否以某种方式没有给您 3?
  • 问题/问题是什么?
  • 您想要符号解决方案吗?
  • 我很困惑(1+2)/1 如何返回1
  • 我不太确定,但我认为他想将(a + b)/a 之类的字符串传递给函数,然后根据变量的实际值获取结果(即3) .

标签: java string expression evaluate


【解决方案1】:

据我所知,没有办法将String 转换为Java 中的变量名。您可能想要做的是从Strings 到ints 的映射。然后您可以解析命令并检索与Strings 关联的值。

例如:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);

不同之处在于,现在不是将值存储在变量中,而是将它们与您可以在输入文本中找到的String 关联。

例如:

Scanner scan = new Scanner("a b c");
String str1 = scan.next();
int val1 = map.get(str1);

现在val 中存储了值1,您之前将其与String“a”相关联。

下一步是为算术编写解析器。这是一种完全不同的动物。如果您正在寻找可以快速实施的东西,我建议您尽可能使用Reverse Polish Notation。无论如何,我不相信有一个快速的解决方案可以完成所有这些,包括自动解析。

您可能想在此处查看此链接:Evaluating a math expression given in string form。这不是您想要做的,但可能会有所帮助。

【讨论】:

    【解决方案2】:

    有一些解析器可以让您评估字符串表达式,但您必须以某种方式映射变量。我 rolled my own 用于数字表达式,我将在您的示例中使用如下:

    int a = 1;                            //Given some variables
    int b = 2;
    
    Evald ex = new Evald();               //and an expression
    ex.parse("(a + b) / a");
    
    ex.addVariable("a", a);               //map the variables
    int bIndex = ex.addVariable("b", b);  //optionally saving an index mapping
    
    double dResult = ex.evaluate();       //evaluate (sets dResult to 3.0)
    
    a = 3;                                //update your variables 
    b = 9;
    ex.addVariable("a", a);               //map new values using the string
    ex.setVariable(bIndex, b);            //or saved index
    
    int iResult = (int)ex.evaluate();     //evaluate (sets iResult to 4)
    

    我使用了更通用的解决方案(从使用类似语法处理字符串、向量、复数等的 JepLua 等脚本语言),选择通常取决于软件要求 - 多功能性、许可、库依赖性和执行速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多