有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用什么数据结构来构建公式计算器

我的团队正在开发一个应用程序,它必须解决许多用户定义的公式。这是一个巨大的电子表格,我们的客户使用的替代品。例如,每个公式都使用简单的算术(大部分)和一些数学函数。我们正在使用一个名为Parsii的表达式求值库来进行实际的公式求值。但是在所有公式中,我们必须按照它们的从属公式的顺序来计算它们。例如

F1 = a + b
F2 = F1 * 10%
F3 = b / 2
F4 = F2 + F3

在上面的例子中,a、b是用户输入的值。系统应计算F1&;F3最初是因为它们直接依赖于用户输入。那么应该计算F3。最后是F4

我的问题是,建议采用什么样的数据结构来建模公式评估的这些依赖关系

我们目前已经将其建模为一个有向图。在上面的例子中,F1&;F3是根节点,F3连接到两者,F4连接到F3,F4是叶节点。我们使用Tinkerpop3图形实现对此进行建模

用于对此建模的任何数据结构都应该具有以下特征。 -易于更改少数顶级根节点的一些输入数据(基于用户输入) -仅重新计算那些依赖于已更改的根节点的公式(因为我们在特定计算上下文中有100个公式,并且必须在1-2秒内响应GUI层) -尽量减少代码量,通过一些现有库创建数据结构。 -能够查询数据结构,通过各种键(公式对象的名称、对象的id、年份等)查询/查找根节点,并能够编辑这些键的属性


共 (1) 个答案

  1. # 1 楼答案

    您当前是否将其存储在平面文件中

    如果希望具有更好的可查询性和更容易的修改,那么可以将其作为DAG存储在数据库表中

    可能是这样(我希望真正的解决方案会有所不同):

    +                             -+
    |                         FORMULA                           |
    +      +       +        +       +
    |   ID (PK)  | FORMULA_NAME | FORMULA_STRING | FORMULA_YEAR |
    +============+==============+================+==============+
    |     1      |      F1      |     a + b      |              |
    +      +       +        +       +
    |     2      |      F2      |    F1 * 10%    |              |
    +      +       +        +       +
    |     3      |      F3      |     b / 2      |              |
    +      +       +        +       +
    |     4      |      F4      |    F2 + F3     |              |
    +      +       +        +       +
    
    
    +                   +
    |         FORMULA_DEPENDENCIES         |
    +        -+          +
    | FORMULA_ID (FK) | DEPENDS_ON_ID (FK) |
    +=================+====================+
    |        2        |         1          |
    +        -+          +
    |        4        |         2          |
    +        -+          +
    |        4        |         3          |
    +        -+          +
    

    有了它,您还可以很容易地知道公式是否依赖于不存在的公式,因为它会违反DEPENDS_ON_ID外键。数据库还可以检测是否有任何公式形成了一个依赖循环。例如,F1依赖于F2依赖于F3依赖于F1

    此外,您可以轻松地将任何元数据添加到表中,并对可能查询的任何内容进行索引