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

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN