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小学僧,本篇不足之处请大佬多多指教