【纯java代码实现字符串运算符或公式计算,支持函数,不借助第三方依赖、工具】

纯java代码实现字符串运算符或公式计算,支持函数,不借助第三方依赖和工具

  • 效果图
  • 代码

效果图

在这里插入图片描述

代码

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;/*** @author zwb* @version 1.0* @Date 2024/1/2* @Description: 字符串公式计算* @Description: 支持运算符:加减乘除,等于,不等于,大于,小于,大于等于,小于等于* @Description: 支持函数:IF(,,),SUM(),AVG(),ABS(),MAX(),MIN()*/
public class StrFormulaUtil {public static void main(String[] args) {String str = "";//加减乘除str = "1*(5-3)/2";System.out.println(str+"的运算结果为:"+initResult(str));//IF(条件,真值,假值)条件函数str = "20-IF(1>=2,5,6)";System.out.println(str+"的运算结果为:"+initResult(str));//SUM(值,值,值)求和函数str = "20-SUM(1,2,3,4,5)";System.out.println(str+"的运算结果为:"+initResult(str));//AVG(值,值,值)平均值函数str = "20-AVG(2,4,8,2)";System.out.println(str+"的运算结果为:"+initResult(str));//MAX(值,值,值)最大值函数str = "20-MAX(1,2,3,4,5)";System.out.println(str+"的运算结果为:"+initResult(str));//MIN(值,值,值)最小值函数str = "20-MIN(1,2,3,4,5)";System.out.println(str+"的运算结果为:"+initResult(str));}/*** @author zwb* @param info* @Description: 公式计算获取结果*/public static String initResult(String info){return initBracket("("+info+")");}/*** @author zwb* @param str* @Description: 核心计算模块*/public static String initNum(String str){String symbol[] = {"+","-","*","/",">","<","=","!=",">=","<="};int add = str.indexOf("+");int subtract = str.indexOf("-");if (subtract!=-1){String num="";if (subtract-1>=0){num = str.substring(subtract-1, subtract);try {Integer.parseInt(num);} catch(NumberFormatException e) {subtract=-1;}}else {subtract=-1;}}int multiply = str.indexOf("*");int divide = str.indexOf("/");int dy = str.indexOf(">");int xy = str.indexOf("<");int dd = str.indexOf("=");int bdd = str.indexOf("!=");int dyd = str.indexOf(">=");int xyd = str.indexOf("<=");int i=0;int j=0;if (multiply==-1&&divide==-1&&add==-1&&subtract==-1&&dy==-1&&xy==-1&&dd==-1&&dyd==-1&&xyd==-1){return str;}if (multiply!=-1||divide!=-1){j=1;i=(multiply==-1)?divide:((divide==-1)?multiply:(multiply<divide?multiply:divide));}else if (add!=-1||subtract!=-1){j=1;i=(add==-1)?subtract:((subtract==-1)?add:(add<subtract?add:subtract));}else if (bdd!=-1||dyd!=-1||xyd!=-1){j=2;Integer index[] = {bdd,dyd,xyd};List<Integer> indexList = Arrays.asList(index).stream().filter(x->x!=-1).collect(Collectors.toList());i= Collections.min(indexList);}else if (dy!=-1||xy!=-1||dd!=-1){j=1;Integer index[] = {dy,xy,dd};List<Integer> indexList = Arrays.asList(index).stream().filter(x->x!=-1).collect(Collectors.toList());i=Collections.min(indexList);}String strs = "";if (Arrays.asList(symbol).contains(str.substring(i,i+j))){String regex = "[\\+\\-\\*/><=(!=)(>=)(<=)]";String left = str.substring(0, i);String right = str.substring(i+j, str.length());String[] lefts = left.split(regex);String[] rights = right.split(regex);if ("-".equals(right.charAt(0)+"")){rights=right.substring(1).split(regex);rights[0] = "-"+rights[0];}String leftStr = left.substring(0,left.length()-lefts[lefts.length - 1].length());String rightStr = right.substring(rights[0].length(),right.length());if ("*".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+leftNum.multiply(rightNum)+rightStr;}else if ("/".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+leftNum.divide(rightNum,4,BigDecimal.ROUND_HALF_UP)+rightStr;}else if ("+".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+leftNum.add(rightNum)+rightStr;}else if ("-".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+leftNum.subtract(rightNum)+rightStr;}else if ("!=".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+(leftNum.compareTo(rightNum)!=0)+rightStr;}else if (">=".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+(leftNum.compareTo(rightNum)>=0)+rightStr;}else if ("<=".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+(leftNum.compareTo(rightNum)<=0)+rightStr;}else if (">".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+(leftNum.compareTo(rightNum)>0)+rightStr;}else if ("<".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+(leftNum.compareTo(rightNum)<0)+rightStr;}else if ("=".equals(str.substring(i,i+j))){BigDecimal leftNum = new BigDecimal(lefts[lefts.length - 1]);BigDecimal rightNum = new BigDecimal(rights[0]);strs = leftStr+(leftNum.compareTo(rightNum)==0)+rightStr;}else {strs = left+str.substring(i,i+j)+right;}}boolean flag = false;for (String item : Arrays.asList(symbol)) {if (strs.contains(item)){flag = true;}}if (flag){strs = initNum(strs);}return strs;}/*** @author zwb* @param info,select* @Description: 指定字符出现的下标抓取*/public static List<Integer> getStrToIndexOf(String info,String select){//记录出现的位置List<Integer> countList = new ArrayList<>();if (info==null){return countList;}//从最前方开始检索int start = 0;//获取检索字符长度int index = select.length();while (true) {if (info.indexOf(select, start) != -1) {//找到对应字符所在索引,当找到后,将下次寻找的位置转换到当前已找到的位置start = info.indexOf(select, start);countList.add(start);//改变下次检索位置 如:yelloye 从索引0开始查找ye,找到后start = 0;则下次从索引2开始检索(即l处)start += index; //涉及到多个字符时比 start++检索速度快} else {break;}}return countList;}/*** @author zwb* @param body* @Description: 公式核心拆解方法*/public static String initBracket(String body){List<Integer> startList = getStrToIndexOf(body, "(");List<Integer> endList = getStrToIndexOf(body, ")");Integer end = endList.get(0);Integer start = Collections.max(startList.stream().filter(s -> s < end).collect(Collectors.toList()));String left = body.substring(0,start);String right = body.substring(end+1,body.length());String middle = body.substring(start+1,end);if (left.length()>=2&&"IF".equals(left.substring(left.length()-2,left.length()))){//IF函数middle = initIf(middle);left = left.substring(0,left.length()-2);}else if (left.length()>=3&&"SUM".equals(left.substring(left.length()-3,left.length()))){//SUM函数middle = initSUM(middle);left = left.substring(0,left.length()-3);}else if (left.length()>=3&&"AVG".equals(left.substring(left.length()-3,left.length()))){//AVG函数middle = initAVG(middle);left = left.substring(0,left.length()-3);}else if (left.length()>=3&&"ABS".equals(left.substring(left.length()-3,left.length()))){//ABS函数middle = initABS(middle);left = left.substring(0,left.length()-3);}else if (left.length()>=3&&"MAX".equals(left.substring(left.length()-3,left.length()))){//MAX函数middle = initMAX(middle);left = left.substring(0,left.length()-3);}else if (left.length()>=3&&"MIN".equals(left.substring(left.length()-3,left.length()))){//MIN函数middle = initMIN(middle);left = left.substring(0,left.length()-3);}else {middle = initNum(middle);}String content = left+middle+right;if (content.indexOf("(")!=-1||content.indexOf(")")!=-1){content = initBracket(content);}return content;}/*** @author zwb* @param str* @Description: IF(条件,真值,假值)函数计算* @Description: 判断条件是否成立,成立则取第一个值,不成立则取第二个值*/public static String initIf(String str){String[] split = str.split(",");String condition = initNum(split[0]);String trueValue = initNum(split[1]);String falseValue = initNum(split[2]);if ("true".equals(condition)){return trueValue;}if ("false".equals(condition)){return falseValue;}if (Integer.valueOf(condition)>0){return trueValue;}else {return falseValue;}}/*** @author zwb* @param str* @Description: SUM(值,值,值)函数计算* @Description: 求所有值的和*/public static String initSUM(String str){String[] split = str.split(",");BigDecimal sumAmount = new BigDecimal(0);for (String s : split) {sumAmount=sumAmount.add(new BigDecimal(initNum(s)));}return sumAmount.toString();}/*** @author zwb* @param str* @Description: ABG(值,值,值)函数计算* @Description: 求所有值的平均值*/public static String initAVG(String str){String[] split = str.split(",");BigDecimal sumAmount = new BigDecimal(0);for (String s : split) {sumAmount=sumAmount.add(new BigDecimal(initNum(s)));}return sumAmount.divide(new BigDecimal(split.length),4,BigDecimal.ROUND_HALF_UP).toString();}/*** @author zwb* @param str* @Description: ABG(值)函数计算* @Description: 求数字的绝对值*/public static String initABS(String str){double abs = Math.abs(Double.valueOf(initNum(str)));return abs+"";}/*** @author zwb* @param str* @Description: MAX(值,值,值)函数计算* @Description: 求出最大值*/public static String initMAX(String str){String[] split = str.split(",");BigDecimal maxAmount = new BigDecimal(0);for (String s : split) {if (new BigDecimal(initNum(s)).compareTo(maxAmount)>0){maxAmount = new BigDecimal(initNum(s));}}return maxAmount.toString();}/*** @author zwb* @param str* @Description: MIN(值,值,值)函数计算* @Description: 求出最小值*/public static String initMIN(String str){String[] split = str.split(",");BigDecimal minAmount = new BigDecimal(initNum(split[0]));for (String s : split) {if (new BigDecimal(initNum(s)).compareTo(minAmount)<0){minAmount = new BigDecimal(initNum(s));}}return minAmount.toString();}
}

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

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

相关文章

在 Oracle 数据库表中加载多个数据文件

在本文中&#xff0c;我将展示 SQL 加载器 Unix 脚本实用程序的强大功能&#xff0c;其中 SQL 加载器可以使用自动 shell 脚本加载多个数据文件。这在处理大量数据以及需要将数据从一个系统移动到另一个系统时非常有用。 它适合涉及大量历史数据的迁移项目。那么就不可能为每…

Elasticsearch:带有自查询检索器的聊天机器人示例

本工作簿演示了 Elasticsearch 的自查询检索器 (self-query retriever) 将问题转换为结构化查询并将结构化查询应用于 Elasticsearch 索引的示例。 在开始之前&#xff0c;我们首先使用 langchain 将文档分割成块&#xff0c;然后使用 ElasticsearchStore.from_documents 创建…

企业微信开发:自建应用:接收消息(企业内部服务器)/回调配置

概述 在企业微信的自建应用中&#xff0c;用户触发了某些行为&#xff08;发送消息、进行菜单操作或者外部联系人变更等&#xff09;&#xff0c;要发送相关信息给企业内部服务器。 备注&#xff1a;接收消息 和 回调&#xff0c;在本文中指代相同的行为&#xff0c;即企业微信…

Jenkins部署项目

一.安装jenkins 1.1进入jenkins官网下载jenkins war包&#xff0c;上传到服务器/usr/local目录。 1.2执行启动jenkins命令&#xff0c;&#xff08;注意jenkins版本需要的jdk版本&#xff09; /usr/local/java11/bin/java -Djava.awt.headlesstrue -jar /usr/local/jenkins.wa…

使用sdf文件+urdf文件模拟机器人示例(不用把urdf转sdf)

gazebo版本&#xff1a;harmonic&#xff1b; <launch> <group> <let name"robot_description" value"$(command xacro $(find-pkg-share gazebo_pkg)/urdf/total.xacro)"/> <node pkg"rviz2" exec"rviz2" name…

[讲座] - 闲聊工业设计

1&#xff0c;工业设计相关的学科分类 2&#xff0c;工业设计的职业发展路线 3&#xff0c;工业设计师的成名人物 4&#xff0c;设计了可口可乐的Loewy 可口可乐的瓶子&#xff0c;无论白天晚上还是瓶子被打碎&#xff0c;都能认出这个是可口可乐的瓶子。 草图参照了可可豆&am…

深度生成模型之GAN优化目标设计与改进 ->(个人学习记录笔记)

文章目录 深度生成模型之GAN优化目标设计与改进原始GAN优化目标的问题1. JS散度度量问题2. 梯度问题 优化目标的设计与改进1. 最小二乘损失GAN2. Energy-based GAN(EBGAN)3. Wasserstein GAN4. WGAN-GP5. Boundary Equilibrium GAN(BEGAN)6. Loss Sensitive GAN7. Relativeisti…

Cuk、Zeta和Sepic开关电源拓扑结构

Cuk、Zeta和Sepic变换器,三种拓扑结构大致类似。不同点在于电感和二极管&#xff0c;MOS管的位置关系的变化。 Cuk电源是一种非隔离的直流电源转换器&#xff0c;其基本结构包括输入滤波电容、开关管、输入电感、输出电感和输出电容等元件。Cuk电路可以看作是Boost和Buck电路的…

基于双闭环PI和SVPWM的PMSM控制器simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 双闭环PI控制器设计 4.2 SVPWM技术 4.3 控制系统实现 5.完整工程文件 1.课题概述 基于双闭环PI和SVPWM的PMSM控制器simulink建模与仿真。系统包括逆变桥、PMSM、park变换、clark变换、SVPWM、PI控…

解决电脑访问共享文件问题:“无法访问。你可能没有权限使用网络资源。请与这台服务器的......”

文章目录 1. 问题2. 解决方法 1. 问题 2. 解决方法 Win R 键入 gpedit.msc在弹出的窗口,展开左侧目录树至安全选项,如图。( 计算机配置-Windows设置:安全设置-本地策略-安全选项)

2023我的编程之路

你的编程学习经历和成长过程&#xff1a; 在我探索编程世界的旅程中&#xff0c;我深刻地认识到&#xff0c;编程不仅仅是一种技术&#xff0c; 是一种思维方式&#xff0c; 一种解决问题的方法。希望通过分享我的编程学习体验&#xff0c;能够启发更多的人看到编程的魅力和价值…

克隆clone github上某个项目的子目录

有时会遇到只需要克隆github某个项目的子目录&#xff0c;此时可以使用以下方法实现&#xff1a; 需求示例&#xff1a; 现需要克隆&#xff1a;https://github.com/SingleZombie/DL-Demos项目中的ddim项目 注&#xff1a;ddim项目的地址为&#xff1a;https://github.com/Sing…

lenovo联想小新Pro-13 2020 Intel IML版笔记本电脑(82DN)原装出厂Win10系统镜像

链接&#xff1a;https://pan.baidu.com/s/1bJpfXudYEC7MJ7qfjDYPdg?pwdjipj 提取码&#xff1a;jipj 原装出厂Windows10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&a…

【ps】如何给人偶添加衣服

使用PS工具扣出人物 使用编辑-变形-操控变型 、

java spring boot 获取resource目录下的文档

主要代码 String filePath"templates/test.xls" ClassPathResource classPathResource new ClassPathResource(filePath); InputStream inputStream classPathResource.getInputStream();目录 主要目录存放再这 代码案例 public void downloadTemplate( HttpS…

数据库云平台新数科技完成B轮融资,打造全链路智能化数据库云平台

数据库云平台软件厂商「北京新数科技有限公司」&#xff08;以下简称「新数科技」&#xff09;已于2023年完成B1轮和B2轮融资&#xff0c;分别由渤海创富和彬复资本投资&#xff1b;义柏资本担任本轮融资独家财务顾问。 新数科技成立于2014年&#xff0c;当前产品矩阵包括数据库…

一起玩儿物联网人工智能小车(ESP32)——23. 变量与函数(一)

摘要&#xff1a;本文介绍变量和函数的基本知识 经过一个阶段的学习&#xff0c;大家对程序开发也有了一个初步的了解。这只能说是刚刚开始&#xff0c;所能实现的功能还非常的有限。接下来就是拓展一下大家的基本开发技能。 在前面的开发中&#xff0c;大家如果认真的练习并且…

模拟控制方式(PWM)

引言 PWM&#xff08;脉冲宽度调制&#xff09;是一种常见的模拟控制方式&#xff0c;通过调节脉冲宽度来控制功率输出的占空比&#xff0c;从而实现模拟信号的传输和控制。在许多领域中&#xff0c;PWM都得到了广泛的应用&#xff0c;如电机控制、LED调光、音频控制等。本文将…

关于this.router 和this.route的总结

this.router 和this.route这2个东西一直在用可是我还是迷迷糊糊的不知道啥啥意思&#xff0c;尤其是idea的提示功能&#xff0c;总是让我一个回车就弄错了。 总结一波&#xff1a; 概述 this.$router(路由实例) : 是VueRouter的实例.包含了很多属性和对象&#xff08;比如 h…

.NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法

在.NET 6中&#xff0c;微软官方建议把 System.Drawing.Common 迁移到 SkiaSharp 库。因为System.Drawing.Common 被设计为 Window 技术的精简包装器&#xff0c;因此其跨平台实现欠佳。 SkiaSharp是一个基于谷歌的Skia图形库&#xff08;Skia.org&#xff09;的用于.NET平台的…