10.仿简道云公式函数实战-逻辑函数-XOR

1. XOR函数

XOR 函数可返回所有参数的异或值。异或的含义是:两个逻辑值相同,返回 false,两个逻辑值不同,则返回 true。

2. 函数用法

XOR(logical1,logical2, …)

3. 函数示例

如,判断两个答案值是否一致时,可设置公式为

XOR(答案1<90,答案2<90),答案一致时返回 false,不一致时返回 true。

4. 代码实战

首先我们在function包下创建logic包,在logic包下创建XorFunction类,代码如下:

package com.ql.util.express.self.combat.function.logic;import cn.hutool.core.util.ObjectUtil;
import com.ql.util.express.ArraySwap;
import com.ql.util.express.InstructionSetContext;
import com.ql.util.express.OperateData;
import com.ql.util.express.instruction.op.OperatorBase;
import com.ql.util.express.self.combat.exception.FormulaException;/*** 类描述:XOR函数** @author admin* @version 1.0.0* @date 2023/11/21 17:13*/
public class XorFunction extends OperatorBase {public XorFunction(String name) {this.name = name;}@Overridepublic OperateData executeInner(InstructionSetContext parent, ArraySwap list) throws Exception {if (list.length < 2) {throw new FormulaException("\"" + this.aliasName + "\"操作至少要两个操作数");}OperateData rst = null;// 1. tj1  tj2  tj3  tj4  tj5OperateData flag = null;if (list.length == 2) {Object zero = list.get(0).getobject(parent);Object one = list.get(1).getobject(parent);if (ObjectUtil.equal(zero,one)) { //rst = new OperateData(Boolean.FALSE,Boolean.class);} else {rst = new OperateData(Boolean.TRUE,Boolean.class);}} else {Object zero = list.get(0).getobject(parent);Object one = list.get(1).getobject(parent);if (ObjectUtil.equal(zero,one)) { //rst = new OperateData(Boolean.FALSE,Boolean.class);flag = rst;} else {rst = new OperateData(Boolean.TRUE,Boolean.class);flag = rst;}Boolean flagB = (Boolean)flag.getobject(parent);for (int i=2;i<list.length;i++) {OperateData tmp = (OperateData)list.get(i);Boolean tmpB = (Boolean)tmp.getobject(parent);if (ObjectUtil.equal(tmpB,flagB)) {flag = new OperateData(Boolean.FALSE,Boolean.class);flagB = (Boolean)flag.getobject(parent);rst = flag;} else {flag = new OperateData(Boolean.TRUE,Boolean.class);flagB = (Boolean)flag.getObject(parent);rst = flag;}}}return rst;}}

把XorFunction类注册到公式函数入口类中,代码如下:

package com.ql.util.express.self.combat.ext;import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressResourceLoader;
import com.ql.util.express.parse.NodeTypeManager;
import com.ql.util.express.self.combat.function.logic.AndFunction;
import com.ql.util.express.self.combat.function.logic.IfFunction;
import com.ql.util.express.self.combat.function.logic.IfsFunction;
import com.ql.util.express.self.combat.function.logic.XorFunction;/*** 类描述: 仿简道云公式函数实战入口类** @author admin* @version 1.0.0* @date 2023/11/21 15:29*/
public class FormulaRunner extends ExpressRunner {public FormulaRunner() {super();}public FormulaRunner(boolean isPrecise, boolean isTrace) {super(isPrecise,isTrace);}public FormulaRunner(boolean isPrecise, boolean isStrace, NodeTypeManager nodeTypeManager) {super(isPrecise,isStrace,nodeTypeManager);}public FormulaRunner(boolean isPrecise, boolean isTrace, IExpressResourceLoader iExpressResourceLoader, NodeTypeManager nodeTypeManager) {super(isPrecise,isTrace,iExpressResourceLoader,nodeTypeManager);}@Overridepublic void addSystemFunctions() {// ExpressRunner 的内部系统函数super.addSystemFunctions();// 扩展公式函数this.customFunction();}/**** 自定义公式函数*/public void customFunction() {// AND函数this.addFunction("AND",new AndFunction("AND"));// IF函数this.addFunction("IF",new IfFunction("IF"));// IFS函数this.addFunction("IFS",new IfsFunction("IFS"));// XOR函数this.addFunction("XOR",new XorFunction("XOR"));}
}

创建测试用例:

package com.ql.util.express.self.combat;import com.ql.util.express.DefaultContext;
import com.ql.util.express.self.combat.ext.FormulaRunner;
import org.junit.Test;/*** 类描述: 实战测试类** @author admin* @version 1.0.0* @date 2023/11/21 15:45*/
public class CombatTest {@Testpublic void XOR() throws Exception{FormulaRunner formulaRunner = new FormulaRunner(true,true);// 创建上下文DefaultContext<String, object> context = new DefaultContext<>();String express = "XOR(答案1>90,答案2<90)";context.put("答案1",95);context.put("答案2",80);Object object = formulaRunner.execute(express, context, null, true, true);System.out.println(object);}}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/268427.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习顶会 NeurIPS 2023 6篇获奖论文速览

噔噔&#xff01;NeurIPS 2023 今天开奖啦&#xff01; 防止有些同学不太清楚这个会议&#xff0c;我先简单介绍一下&#xff1a;NeurIPS是机器学习领域的顶级会议&#xff0c;与ICML&#xff0c;ICLR并称为机器学习领域难度最大&#xff0c;水平最高&#xff0c;影响力最强的…

AOP跨模块捕获异常遭CGLIB拦截而继续向上抛出异常

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、BUG详情 1.1 报错信息 1.2 接口响应信息 1.3 全局异常处理器的定义 二、排查过程 三、解决方案 四、总结 前言 最近&…

Web安全之XXE漏洞原理及实践学习

一、原理&#xff1a; XXE漏洞全称即XML外部实体注入漏洞。 攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)&#xff0c;导致可加载恶意外部文件&#xff0c;利用file协议造成文件读取、命令执行、内网端口扫描、攻击内网网站等…

Linux高级管理--安装MySQL数据库系统

MySQL服务基础 MySQL.是一个真正的多线程、多用户的SQL数据库服务&#xff0c;凭借其高性能、高可靠和易于使 用的特性&#xff0c;成为服务器领域中最受欢迎的开源数据库系统。在2008年以前&#xff0c;MySOL项目由MySQL AB公司进行开发&#xff0c;发布和支持&#xff0c;之后…

4年外包终上岸,我只能说这类公司能不去就不去......

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是4年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

广州芳村超5亿元“金融茶”爆雷,涉案金额高达5亿元。

昌世茶是一家茶叶厂商&#xff0c;在芳村茶叶市场开展业务。他们通过多位销售人员宣传其茶叶具有巨大的投资价值&#xff0c;并承诺高价回收。投资者被诱以高价购买茶叶&#xff0c;但随后发现价格迅速下跌&#xff0c;且昌世茶不再履行回收承诺。许多投资者因此遭受重大损失。…

靠着这份280页的前端面试指南,拿下了字节跳动offer

笔者是在今年秋招面试的头条教育线&#xff0c;顺利拿到了offer&#xff0c;把还记得的东西写下来&#xff0c;供大家参考一下。 一面 tcp 和 udp 的区别和使用场景&#xff1f;quic 基于 udp 怎么保证可靠性&#xff1f;讲一下同源策略和跨域方案&#xff1f;CORS 的几个头部…

MeterSphere实战(一)

MeterSphere是一位朋友讲到的测试平台&#xff0c;说这东西是开源的&#xff0c;因为我是做测试的&#xff0c;很乐意了解一些新鲜事物。在我看来&#xff0c;测试就是要专注一些领域&#xff0c;然后要啥都会一点点&#xff0c;接着融会贯通起来&#xff0c;这样就可以万变不离…

如何在 Git 中创建分支

1.打开命令行终端&#xff0c;执行以下命令来查看当前分支列表&#xff1a; git branch 显示当前仓库中的所有分支&#xff0c;以及当前所在的分支&#xff08;显示为带有星号 * 的分支&#xff09;。 2.创建一个新的分支&#xff0c;可以使用以下命令&#xff1a; git bran…

ABAP: POST 方式建立连接

1、采用APIpost 设置截图如下&#xff1a; ABAP建立调用设置 DATA: lr_http_client TYPE REF TO if_http_client.DATA: l_url TYPE STRING."建立服务 http客户端 CALL METHOD cl_http_client>create_by_urlEXPORTINGurl l_url "连接的地址IMPORTI…

LeetCode面向运气之Javascript—第66题-加1-99.78%

LeetCode第66题-加1 题目要求 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 举例 输入&#xff1a;digits [1,2,3] 输出&#xff1a;[1,2,4] 输入&#xff…

vue3 echarts 各省地图展示

效果&#xff1a; 1.在src下新建utils文件夹添加各省地图的json文件&#xff08;下载各省地图的网址 DataV.GeoAtlas地理小工具系列&#xff09; 2.安装echarts npm install echarts 3.在项目文件中中引入json <template><div class"back"><div id…