如果我的数据表中存储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
分享到:
相关推荐
此外,通过合理的设计与编码,还可以增加更多的特性,如支持更多类型的运算符、增强错误处理能力等。这种实现方式不仅适用于简单的数学表达式处理,也为理解和学习数据结构及算法提供了一个很好的案例。
在计算机科学中,二叉树是一种常用的数据结构,它广泛应用于算法设计、数据存储等领域。本篇将详细介绍如何根据给定的先序遍历序列(其中使用`&`来表示空指针)来构建一颗二叉树,并对这一过程进行深入分析。 #### ...
通过以上步骤,我们可以设计并实现一个计算二叉树表示的算数表达式值的算法。这个算法具有广泛的用途,不仅适用于简单的四则运算,还可以扩展到更复杂的表达式,如括号嵌套、负数、浮点数等。在实际的软件开发中,...
数据与算法实验报告聚焦于二叉树这一主题,实验旨在帮助学生深入理解链式存储二叉树的特性、操作方式以及递归算法的设计与实现。实验涵盖了二叉搜索树(Binary Search Tree, BST)的构造、操作以及相关性质的利用。 ...
二叉排序树(Binary Search Tree,BST)是二叉树的一个重要应用,它遵循一个关键规则:左子树中的所有节点值小于父节点,右子树中的所有节点值大于父节点。这种特性使得二叉排序树非常适合进行查找操作,因为我们...
- 后序遍历在求解二叉树时通常与前序或中序结合,如在给定前序和后序遍历时,由于前序遍历无法区分左右子树,可能需要尝试多种可能的划分,构建出所有可能的二叉树结构,然后匹配中序遍历来找到正确答案。...
此外,还可以利用其他数据结构如队列、二叉树等来解决括号匹配问题,但栈通常是最简洁且效率较高的方法。对于复杂性分析,使用栈的方法时间复杂度为O(N),其中N是括号序列的长度,因为每个括号只被处理一次。 为了...
在计算机科学中,二叉树是一种常见的数据结构,它广泛应用于算法设计、数据库索引构建等领域。对于初学者来说,理解二叉树的基本概念及其在C++中的实现非常重要。本文将详细介绍一个简单的二叉树实现,包括节点类、...
例如,可以为一个关键字定义“等于”匹配规则,为另一个关键字定义“大于等于”匹配规则,还可以为第三个关键字定义“小于”匹配规则等。这样一来,可以根据多关键字和相应的匹配规则来对数据集进行组织和查询,从而...
算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...
算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...
算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...
算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...
本设计任务要求创建一个二叉树,并实现对该二叉树的多种遍历方式。 **1.2 基本要求:** - **a. 分别运用非递归的方式完成对二叉树的先序和后序遍历** - 实现二叉树的先序遍历(前序遍历):访问顺序为根节点 -> 左...
通过理解并掌握括号匹配算法,程序员可以更好地理解和设计解析器、编译器以及各种文本处理工具。不仅如此,括号匹配问题也是面试和编程竞赛中常见的题目,它能很好地检验应聘者的基础算法知识和问题解决能力。因此,...
在本研究中,为了快速适应规则的更新并提高包分类速度,采用了硬件电路和二叉树结构来设计和实现基于FPGA的包分类系统。二叉树在这里被用作一种数据结构,用于实现包分类过程中的快速搜索和匹配。二叉树的每个节点...
实验结果表明,与OPS5解释器相比,LEAPS产生的执行时间可以快两个数量级以上,这得益于其高效的数据结构和算法设计,特别是针对规则触发率的优化。 #### 数据结构与算法理解的挑战 然而,LEAPS的数据结构和算法因...
6. **匹配引擎**:匹配引擎是订单簿的核心,负责根据价格优先级和时间优先级规则匹配买家和卖家的订单。可能采用了不同的匹配算法,如价格优先、时间优先或者最小交易量优先等。 7. **设计模式与并发控制**:在处理...
括号匹配检验是计算机科学中常见的问题,常用于解析表达式或验证语法规则。在C++中,可以利用栈的后进先出(LIFO)特性来解决。当遇到左括号时,将其压入栈中;遇到右括号时,检查栈顶元素是否为对应的左括号,若是...