Java原生字符串四则运算

代码可以实现不含括号的四则运算

输入算数字符串
例如:“14+5*94-6+49+8/3”
输出:529(计算结果为int类型)

所需要的一些小知识
Integer.parseInt(str);//String转int
try…catch语句
String中的部分操作类

主方法代码

public static void main(String[] args) {
		String str = "14+5*94-6+49+8/3";
		
		try {
			int num = Calculate(str);	//如果字符串中存在非运算字符会抛出异常,所以做一下异常处理
			System.out.println(num);
		} catch (Exception e) {
			System.err.println("字符串中存在非数字字符");
			e.printStackTrace();
		}
	}

Calculate方法:计算方法参数为String类型。返回值为int类型

public static int Calculate(String str) {
		//先算乘除:四则运算中优先级
		String cc = ccPeration(str);
		//在算加减
		int num = asPeration(cc);
		return num;
	}

ccPeration方法:计算乘除的运算,参数为String类型,返回值为String类型

public static String ccPeration(String str) {
		/*	整体罗辑:按顺序扫描*和/,扫描到,停下,根据停下的位置向前后扫描,
		 * 扫描到非数字,停下,计算该区间的*或/结果,生成新的字符串,按照新的字符串,继续扫描
		 * 结束标志:不存在 /  *
		 * */
		//先转换成字符型数组
		char[] strArr = str.toCharArray();
		//需要用到的变量
		int leftIndex = 0;
		int rightIndex = 0;
		String strTemp = str;
		//开始扫描
		for (int i = 0; i < strArr.length; i++) {
			if(strArr[i]=='*' || strArr[i]=='/') {//如果发现*或/停下
				//向左扫描到非数字存下索引:标记*或/的乘数/被除数
				for (int j = i-1; j >0 ; j--) {
					if (strArr[j]>'9' || strArr[j]<'0' ) {
						leftIndex = j;
						break;
					}
				}
				//向右侧扫描:标记乘数/除数
				for (int j = i+1; j < strArr.length; j++) {
					if (strArr[j]>'9' || strArr[j]<'0' ) {
						rightIndex = j;
						break;
					}
					//没有扫描到证明整个数字都已经扫描完了,最后一个数组就应该是数组/字符串的长度
					rightIndex = strArr.length;
				}
				//此时三个数字,三个索引,乘/被除数、运算符、乘/除数;strTemp = 54*94
				//取乘数/被除数
				int left = Integer.parseInt( str.substring(leftIndex+1,i) );
				//取到乘数/除数
				int right = Integer.parseInt( str.substring(i+1,rightIndex) );
				//计算该部分结果
				int resultTemp = 0;
				if(strArr[i]=='*') {
					resultTemp = left * right;
				}else {
					resultTemp = left / right;
				}
				//重新生成一个字符串
				strTemp = str.substring(0,leftIndex+1) + resultTemp + str.substring(rightIndex);
				break;
			}
		}
		{//遍历结束标识,如果原字符串中没有* / 标志着计算完成
		if(str.indexOf("*")==-1 || str.indexOf("/")==-1) 
			return strTemp;
		}
		return ccPeration(strTemp);//递归运算
	}

ccPeration方法执行过后,得到一个不含*、/的字符串,在计算加减运算
asPeration方法,执行加减运算,参数为String,返回为int

public static int asPeration(String str) {
		//若果该串中不存在+和-,证明里边全是数字了,直接转换返回
		if(str.indexOf("+")==-1 && str.indexOf("-")==-1) {
			return Integer.parseInt(str);
		}
		//存在的话,开始进一步计算,整体思路更成熟类似
		char[] strArr = str.toCharArray();
		int oneNum = 0;	//存放第一个数字
		/* 整体思路:分别使用+-拆分字符串,两个之间必然有一个拆出来的第一个元素转换成整型是合法的
		 * 利用try...catch特性
		 * 假定使用+拆除来有问题,那么执行catch中使用-拆分
		 * 假定使用+拆除来没问题,那么catch不在执行
		 * 12个特殊字符:.  $  |   (   )  [   {   ^  ?  *  +  \\ 
		 * */
		try {
			//使用+拆分字符串需要添加双反斜杠【12个特殊字符】
			oneNum = Integer.parseInt(str.split("\\+")[0]);	
		} catch (Exception e) {
			oneNum = Integer.parseInt(str.split("-")[0]);
		}
		
		int numtemp = 0;
		for (int i = 0; i < strArr.length; i++) {
			if(strArr[i] == '+') {
				for (int j = i+1; j < strArr.length; j++) {
					if((strArr[j]>'9' || strArr[j]<'0')||j==strArr.length-1) {
						if(j==strArr.length-1) {//需要判断一下是不是最后一个数
							oneNum += Integer.parseInt(str.substring(i+1, j+1));
						}else {
							oneNum += Integer.parseInt(str.substring(i+1, j));
						}
						break;
					}
				}
			}else if(strArr[i] == '-'){
				for (int j = i+1; j < strArr.length; j++) {
					if((strArr[j]>'9' || strArr[j]<'0')||j==strArr.length-1) {
						if(j==strArr.length-1) {//需要判断一下是不是最后一个数
							oneNum -= Integer.parseInt(str.substring(i+1, j+1));
						}else {
							oneNum -= Integer.parseInt(str.substring(i+1, j));
						}
						break;
					}
				}
			}
		}
		return oneNum;
	}

到此整体已经结束
所有方法均使用static修饰,可以再main方法中直接调用
所以asPeration方法也可以直接计算任意位的加减法

本篇由懂得不太多tgb原创
本人为java小学僧,本篇不足之处请大佬多多指教