【问题标题】:Finding duplicate expressions/parameters查找重复的表达式/参数
【发布时间】:2014-12-02 08:47:58
【问题描述】:

我的结构如下

Parameter -> Condition -> Rule

假设我需要创建一个Business ruleCustomer Age > 18

我有两个参数,Customer Age (P1) and 18(P2),其中P1 is Field Parameter (Ognl)P2 is constant Parametervalue 18

所以我的Condition 现在是Customer Age > 18 和我的Rule

问题说明:避免用户创建重复的参数/条件和规则。

解决方案Constant Parameters, Field Parameters etc我可以检查数据库并比较是否已经存在。

现在条件对我来说,

Customer Age > 1818 < Customer Age 在业务术语上是相同的。

上述情况可能更复杂。

(a + b) * (c + d) is same as (b + a) * (d + c)

我需要验证上面的表达式。

第一种方法 - 从 DB 加载所有表达式(可以是 10000 的)并比较 using Stack/Tree Structure,这真的会扼杀我的目标。

第二种方法 - 我正在考虑建立完整的权力,比如说hashcode generator,或者我们可以对每个表达式说一个int value(还考虑运算符/括号)。这个值的生成方式应该能够验证上面的表达式。

意味着a + bb + a 应该生成相同的int value,而a - bb - a 应该生成不同的。

【问题讨论】:

    标签: java string validation expression duplication


    【解决方案1】:

    也许是您第一种方法的简化版本:通过查找您将要插入数据库的相似内容来仅过滤相关表达式怎么样?

    如果您知道您将要插入 Customer Age,您可以找到包含此参数的所有表达式,并根据这组简化的表达式构建堆栈/树。

    【讨论】:

    • 正确,我可以减少输出/迭代,但我的应用程序仍然在 100 个条件下使用相同的参数,规则...
    • 我真的很喜欢您使用自定义散列函数的方法。问题是您必须确保散列值(例如字符串 Customer Age)在使用时完全相同相同(而不是 customer Age 等)。
    • 我担心名字,用户可以给任何,参数下面的内容,我想在哈希码计算中使用的条件,比如值为18的参数可以命名为18或18或18等。 .
    • 如果您不想弄乱“18”/“Eighteen”/“eighteen”/etc 的相似性,您可以限制用户输入,例如通过强制将整数插入为数字而不是文本。对于像“客户年龄”这样的属性,您还可以通过在输入字符串时列出类似属性来提供内容帮助:)
    【解决方案2】:

    我认为您无法避免编写表达式解析器、构建表达式的 AST 和代码重写规则以检测表达式等价性。

    这可能没有您想象的那么耗时。

    解析和AST构建部分,可以从exp4j开始: http://www.objecthunter.net/exp4j/

    重写规则可以看一下:Strategies for simplifying math expressions

    【讨论】:

    • 与我提到的完全相同,但或多或​​少会非常耗时,在任何给定时间我都可以拥有 1000 条规则,3-5K 条件,.....
    • 两种情况下,我都不能给客户一些需要时间来创造东西的东西。
    • 可能你是对的,并且根据你过去的经验,如果你能编辑你的答案并详细解释我,我会更喜欢,这可能对我有帮助。我的表达式存储在数据库中,我有实体,使用 Hibernate,它是服务器端验证。
    • 糟糕,我以为你想在 Javascript 中执行此操作。我现在意识到您不想在浏览器中执行此操作,而是在 Java 中执行此操作。对不起
    • 执行时间应该不是问题,因为它只取决于解析时间和规范化时间。您的所有表达式都将以规范化形式存储,并使用您建议的哈希键,如果存在等效表达式,则可以在恒定时间内找到规范化表达式。
    【解决方案3】:

    要获得 100% 安全的解决方案,您应该使用计算机代数系统分析表达式,看看是否存在数学上相等的情况。但这并不容易。

    一种实用的方法,可以测试两个表达式是否相似

    • 检查它们是否具有相同的变量
    • 比较多个不同输入的输出,看看输出是否相等

    您可以将一组预定义输入的变量列表和输出存储为表达式的“哈希”。这个散列不能保证两个表达式相等,但是你可以向用户展示具有相同散列的表达式,询问这个新规则是否等于这些相似规则之一。

    【讨论】:

      猜你喜欢
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多