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

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取