查找重复的表达式/参数

时间:2014-12-02 08:47:58

标签: java string validation expression duplication

我的结构如下

Parameter -> Condition -> Rule

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

我有两个参数,Customer Age (P1) and 18(P2)P1 is Field Parameter (Ognl)P2 is constant Parameter value 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&#39; s)并比较using Stack/Tree Structure,这将真正杀死我的目标。

第二种方法 - 我正在考虑建立权力,让我们说hashcode generator或者我们可以对每个表达式说一个int value(也考虑运算符/括号)。应该以验证上述表达式的方式生成此值。

方法a + bb + a应生成相同的int value,而a - bb - a应生成不同的内容。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我认为你不能避免编写表达式解析器,构建表达式的AST和代码重写规则来检测表达式的等价。

它可能不像你想象的那么耗时。

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

对于重写规则,您可以查看:Strategies for simplifying math expressions

答案 2 :(得分:1)

对于100%安全的解决方案,您应该使用计算机代数系统分析表达式,以确定是否存在数学上相同的表达式。但那并不容易。

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

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

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