如果我的数据表中存储n条如下形式的规则:
1:a=1 && b= 2 && c=3 && d=4
2.a=1 || b= 2 || c=3
3.a=1 && (b= 2 || c=3)
4.a=1 && c IN (C1,C2,C3)
我的请求参数都如下列形式:
{a=1,c=C3}
那么该如何设计代码,来实现入参匹配规则?
首先应该将规则转化为树模型,组件轮廓如下:
class Condition{
/**
* 条件是否匹配
* @return
*/
boolean isMatch(RequestParam requestParam);
}
class AndOrCondition implements Condition{
/** 条件枚举 */
protected ConditionOp conditionOp;
Condition left;
Condition right;
/**递归遍历*/
public boolean isMatch(RequestParam requestParam)
switch (conditionOp) {
case AND:
isMatch = left.isMatch(context)
&& right.isMatch(requestParam);
break;
case OR:
boolean leftMatch = left.isMatch(requestParam);
if (leftMatch) {
// 如果左子树匹配成功,则直接短路返回true
isMatch = true;
} else {
// 如果右子树匹配成功,则直接短路返回true
isMatch = right.isMatch(requestParam);
}
break;
}
}
class ComparableCondition implements Condition{
/** 左子节点名 */
private String left;
/** 右子节点名 */
private String right;
/**逻辑运算符号*/
private ConditionOp conditionOp;
/**数据类型*/
private String dataType;
/** 条件是否匹配
* @param requestParam
* @return
*/
public boolean isMatch(RequestParam requestParam) {
boolean isMatch = false;
if (requestParam.containsProperty(left)) {
isMatch = //字符串匹配结果
}
return isMatch;
}
}
/**
* 条件枚举
*/
public enum ConditionOp {
/** 逻辑与 */
AND,
/** 逻辑或 */
OR,
/** 集合包含 */
IN,
/** 集合不包含 */
NOTIN,
/** 等于 */
EQ,
/** 不等于 */
NE,
/** 小于 */
LT,
/** 小于等于 */
LE,
/** 大于 */
GT,
/** 大于等于 */
GE,
/** startsWith匹配 */
SW,
/** endsWith匹配 */
EW
}
用这几个组件将上面的规则1转化为如下数据模型:
AndOrCondition[left=ComparableCondition[right=1,left=a,dataType=STRING,conditionOp=EQ],
right=AndOrCondition[left=ComparableCondition[right=2,left=b,dataType=STRING,conditionOp=EQ],
right=AndOrConditin[left==ComparableCondition[right=3,left=c,dataType=STRING,conditionOp=EQ],right=ComparableCondition[right=4,left=d,dataType=STRING,conditionOp=EQ]]]]
可以看到只有叶子节点ComparableCondition会真正进行比较,AndOrCondition会继续遍历寻找它的叶子节点。
规则一树模型:
规则三树模型:
那么表达式转为java二叉树领域模型如何实现?
未完待续
- 大小: 18.9 KB
- 大小: 11.9 KB
分享到:
相关推荐
算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...
算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...
算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...
算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...
最佳匹配问题,构造哈夫曼树(限选,解压缩软件(限选),小型文本编辑器,电梯模拟系统,决策树构造,关联规则求解,老鼠走迷宫,广义表实现,无向图的简单路径,工资管理系统,散列表的设计与实现,宿舍管理查询软件...
7.1.6 不规则二维数组 7.2 矩阵 7.2.1 定义和操作 7.2.2 类matrix 7.3 特殊矩阵 7.3.1 定义和应用 7.3.2 对角矩阵 7.3.3 三对角矩阵 7.3.4 三角矩阵 7.3.5 对称矩阵 7.4 稀疏矩阵 7.4.1 基本概念 7.4.2 用单个线性表...
4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数...
4 最简单的 C程序设计—顺序程序设计 4.1 C语句概述 51 4.2 赋值语句 53 4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数...
本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...
计算符合规则的项目 设置不匹配 缺少号码 两个链表的交集 二叉树中的平均水平 N进制树的最大深度 员工重要性 表兄弟在二叉树中 唯一元素的总和 使用堆栈实现队列 删除回文序列 目标解析器解释 根到叶二...
2、实现1所要求的代码后,运行设计好的代码,将以下的几组整数序列建成搜索二叉树,并记录下它们的前序遍历序列和后序遍历序列: a. 1、3、5、7、9; b. 1、13、35、13、27; c. 50、25、78、13、44、...