具有无序变量功能的Java公式评估库

时间:2012-06-20 10:02:42

标签: java parsing math formula

我目前正在寻找一个用于公式解析和评估的java库(或带有java API的本机库)。

使用这里的推荐,我看了很多库:

  • JFormula
  • JEval
  • Symja
  • JEP

但它们都没有满足我的需求,那就是:

  • 多个公式评估,它们之间具有相关性(公式始终是使用其他变量或数值对变量的影响)
  • 只改变一个公式,可能只有50个,如果只有一个公式改变,那么表现良好
  • 无需手工处理变量依赖
  • 如果公式更改
  • ,则自动更新其他因变量
  • 听取哪个变量改变的可能性
  • 无需为变量设置特定格式(用户将直接输入名称,并且不希望使用复杂符号)

也许一个例子会更好。假设我们按此顺序输入系统:

  • a = b + c
  • c = 2 * d
  • b = 3
  • d = 2

我希望能够按此顺序输入这4行,并询问“a”(或“b”,无论如何)的结果。 然后,如果在用户界面(基本上是表变量<>公式)“b”更改为“2 * d”,库将自动更改“b”和“a”的值,并返回我(或午餐一个事件,或称一个功能)一个变化列表

最好的库就像JEP一样,但具有无序变量功能和自动评估因变量的可能性

我知道编译器和电子表格软件使用这样的机制,但我没有找到任何直接可用的java或java兼容库

有人知道吗?

编辑:精确:问题实际上是关于一个库,或者最终是一组链接在一起的库。问题是公司的项目,并且想法是花费最少的时间。 “自己动手”的解决方案已经被估算出来,不在问题的范围内

5 个答案:

答案 0 :(得分:1)

对于我还需要一个简单的公式解析器的项目,我在javaworld.com中使用了文章Lexical analysis, Part 2: Build an application的代码。它简单而小巧(7个等级),您可以根据自己的需要进行调整。

您可以降级源表单here(搜索“Lexical Analysis Part II”条目)。

答案 1 :(得分:0)

不知道任何图书馆。

假设你所拥有的是一组方程式,其中至少在方程的一侧有一个变量(A + B = CD不允许)且没有循环,(例如,A = B + 1; B = A-2),您在技术上需要做的是构建一个数据流图,显示每个运算符如何依赖于其操作数。对于无副作用的方程(例如纯数学),这很容易;最终得到一个有向无环图(一个带有共享子表示森林的共享子表达式)。然后,如果更改了变量的值,或者引入了新的公式,则修改dag并重新评估更改的部分,将dag中的更改传播到dag根。因此,您需要为表达式构建树,然后共享它们(通常通过在子树上进行散列来查找潜在的等效候选项)。所以,很多结构操作来保持dag(并且是根值)

但是,如果它显示的复杂性只有50个变量,它会起作用,你可以简单地重新评估它们。如果将表达式存储为树(或者更好,反向抛光),您可以非常快速地评估每棵树,并且不需要支付任何开销来保持所有这些数据结构的最新状态。

如果你有数百个方程式,那么dag方案可能要好得多。

如果您有约束方程式(例如,您不限制双方都可以使用的方程式),那么您就不在电子表格范例之内并进入约束求解器,这是一个更多复杂的技术。

答案 2 :(得分:0)

你为什么不写自己的?您对此任务的复杂性的评估可能是错误的。它比你想象的容易得多 - 有机会,学习如何处理任何第三方库比从头开始实现这样一个微不足道的东西需要更多的努力。在最坏的情况下,它不应该花费超过几个小时。

寻找第三方库来做简单的事情没有任何意义(我知道,它是Java精神的一部分,但仍然......)

我建议您查看Cells库以获取灵感。它在Common Lisp中,但想法基本可以转移到其他任何地方。

答案 3 :(得分:0)

您也可以查看这些链接......

答案 4 :(得分:0)

我会嵌入Groovy,请参阅有关嵌入here的教程。 Freeplane(Java Mindmapper)也使用Groovy进行公式化。

每当变量发生变化时,您必须将新值放入绑定中。 应将所有单元代码作为单个代码段提供给Groovy Shell。您可以通过BindPath注册更改。

无论如何,我认为你必须实施一个薄层来满足你的要求:

  • 无需手工处理变量依赖
  • 听取哪个变量改变的可能性