24.仿简道云公式函数实战-数学函数-COUNTIF

2024-02-06 12:36

本文主要是介绍24.仿简道云公式函数实战-数学函数-COUNTIF,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. COUNTIF函数

2. 函数用法

COUNTIF(value1, value2, …, criteria)

3. 函数示例

统计满足条件的参数个数,value 代表不同的值,criteria 为判断条件。

COUNTIF([1,2,3,4], ">2"),返回结果为2

COUNTIF([1,2,3,4], "!=2"),返回结果为3

COUNTIF([1,2,3,4], ">=1"),返回结果为4

COUNTIF(["a", "b", "c"], "d"),返回结果为0

4. 代码实战

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

package com.ql.util.express.self.combat.function.math;import com.ql.util.express.Operator;
import com.ql.util.express.self.combat.exception.FormulaException;import java.util.Arrays;
import java.util.function.Predicate;/*** 类描述: COUNTIF函数** @author admin* @version 1.0.0* @date 2023/11/23 10:40*/
public class CountIfFunction extends Operator {public CountIfFunction(String name) {this.name = name;}@Overridepublic Object executeInner(Object[] objects) throws Exception {// 参数校验if (objects.length == 0) {throw new FormulaException("操作数异常");}Predicate<Object> predicate = null;// 截取条件String criteria = objects[objects.length-1].toString();String op = criteria.replaceAll("[0-9]", "");// 值Object[] values = copyV(objects);if (">".equals(op)) {// 提取数字值String conditionV = criteria.replaceAll("[^0-9]", "");predicate = object -> {double param = Double.parseDouble(object.toString());double p = Double.parseDouble(conditionV);return param > p;};} else if ("<".equals(op)) {// >=// 提取数字值String conditionV = criteria.replaceAll("[^0-9]", "");predicate = object -> {double param = Double.parseDouble(object.toString());double p = Double.parseDouble(conditionV);return param < p;};} else if ("<=".equals(op)) {// >=// 提取数字值String conditionV = criteria.replaceAll("[^0-9]", "");predicate = object -> {double param = Double.parseDouble(object.toString());double p = Double.parseDouble(conditionV);return param <= p;};} else if (">=".equals(op)) {// 提取数字值String conditionV = criteria.replaceAll("[^0-9]", "");predicate = object -> {double param = Double.parseDouble(object.toString());double p = Double.parseDouble(conditionV);return param >= p;};} else if ("!=".equals(op)) {// 提取数字值String conditionV = criteria.replaceAll("[^0-9]", "");predicate = object -> {double param = Double.parseDouble(object.toString());double p = Double.parseDouble(conditionV);return param != p;};} else if ("==".equals(op)) {// 提取数字值String conditionV = criteria.replaceAll("[^0-9]", "");predicate = object -> {double param = Double.parseDouble(object.toString());double p = Double.parseDouble(conditionV);return param == p;};} else {predicate = object -> object.toString().equals(criteria);}final long count = Arrays.stream(values).filter(predicate).count();return count;}public Object[] copyV(Object[] src) {Object[] rst = new Object[src.length-1];for (int i=0;i<rst.length;i++) {rst[i] = src[i];}return rst;}}

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

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.*;
import com.ql.util.express.self.combat.function.math.*;/*** 类描述: 仿简道云公式函数实战入口类** @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() {// 逻辑公式函数this.addLogicFunction();// 数学公式函数this.addMathFunction();}public void addLogicFunction() {// 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"));// TRUE函数this.addFunction("TRUE",new TrueFunction("TRUE"));// FALSE函数this.addFunction("FALSE",new FalseFunction("FALSE"));// NOT函数this.addFunction("NOT",new NotFunction("NOT"));// OR函数this.addFunction("OR",new OrFunction("OR"));}public void addMathFunction() {// ABS函数this.addFunction("ABS",new AbsFunction("ABS"));// AVERAGE函数this.addFunction("AVERAGE",new AvgFunction("AVERAGE"));// CEILING函数this.addFunction("CEILING",new CeilingFunction("CEILING"));// RADIANS函数this.addFunction("RADIANS",new RadiansFunction("RADIANS"));// COS函数this.addFunction("COS",new CosFunction("COS"));// COT函数this.addFunction("COT",new CotFunction("COT"));// COUNT函数this.addFunction("COUNT",new CountFunction("COUNT"));// COUNTIF函数this.addFunction("COUNTIF",new CountIfFunction("COUNTIF"));}
}

创建测试用例

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 COUNTIF() throws Exception{FormulaRunner formulaRunner = new FormulaRunner(true,true);// 创建上下文DefaultContext<String, Object> context = new DefaultContext<>();String express = "COUNTIF(1,2,3,4,5,'!=2')";Object object = formulaRunner.execute(express, context, null, true, true);System.out.println(object);}}

运行结果

这篇关于24.仿简道云公式函数实战-数学函数-COUNTIF的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684326

相关文章

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点