10

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

使用此处的建议,我查看了许多库:

  • J公式
  • 杰瓦尔
  • 辛贾
  • 杰普

但它们都不能满足我的需求,即:

  • 具有相互依赖关系的多个公式评估(公式始终是对使用其他变量或数值的变量的影响)
  • 可能仅更改 50 个公式中的一个,如果仅更改一个公式,则具有良好的性能
  • 无需手动处理变量依赖
  • 如果公式发生变化,自动更新其他因变量
  • 可以监听哪个变量发生了变化
  • 无需为变量指定特定格式(用户将直接输入名称并且不想使用复杂的符号)

也许举个例子会更好。假设我们已经按以下顺序输入了系统:

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

我希望能够按此顺序输入这 4 行,并询问“a”(或“b”等)的结果。那么如果在用户界面(基本上是一个表变量<>公式)“b”改为“2 * d”,库会自动改变“b”和“a”的值,并返回我(或午餐an事件或调用函数)更改列表

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

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

有人知道吗?

编辑:精度:问题实际上是关于一个库,或者最终是一组库链接在一起。问题是针对公司的一个项目,其想法是花费最少的时间。“自己动手”的解决方案已经估计过了,不在问题的范围内

4

5 回答 5

1

对于我还需要一个简单的公式解析器的项目,我使用了文章词法分析,第 2 部分:在 javaworld.com 中构建应用程序的代码。它既简单又小(7 类),您可以根据自己的需要进行调整。

您可以在此处下载源表单(搜索“词法分析第二部分”条目)。

于 2012-07-17T09:38:36.953 回答
0

我会嵌入Groovy,请参阅关于嵌入的教程Freeplane(一个 Java Mindmapper)也使用 Groovy 来制作公式。

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

无论如何,我假设您必须实现一个薄层来满足您的要求:

  • 无需手动处理变量依赖
  • 可以监听哪个变量发生了变化
于 2012-07-17T09:09:10.983 回答
0

你也可以检查这些链接......

于 2012-07-16T19:13:54.977 回答
0

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

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

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

于 2012-07-12T09:04:14.013 回答
0

不知道任何图书馆。

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

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

如果您有数百个方程,则 dag 方案可能要好得多。

如果你有约束方程(例如,你没有限制两边可以有什么),你就脱离了电子表格范式,进入了约束求解器,这是一项复杂得多的技术。

于 2012-07-10T13:57:45.910 回答