字符串解析运算符加减法(不使用BIgInterge)的方法,麻烦帮我看下

今天写一个字符串加减法(不使用BIgInterge)的方法,麻烦大家帮我看下有无问题:

public class StringCalculator {
    public static void main(String[] args) {
        // test
        System.out.println(parseStrAri("99+1+99+1-99="));
    }

    // 解析加减运算
    private static String parseStrAri(String dest) {
        // 运算数组
        String[] nums = dest.split("\\+|-|=");
        //运算符号
        char[] ops = dest.replaceAll("[0-9]", "").toCharArray();
        // 校验参数
        if (nums.length == 0 || ops.length == 0) {
            throw new IllegalArgumentException("输入参数不正确,不符合表达式");
        }
        int numIndex = 0;
        String result = nums[0];
        for (char c : ops) {
            switch (c) {
                case '+':
                    // -result +b 按照 -(a-b) 处理  -1000+ 20000
                    if ("-".equals(result.substring(0,1))){
                        String numA =  expunge(result);
                        String numB =  nums[++numIndex];
                        if (isLeftBig(numA,numB)){
                            result = subtractionStr(numA, numB);
                            result = "-"+result;
                        }else {
                            result = subtractionStr(numB, numA);
                        }
                    }else {
                        result = additionStr(result, nums[++numIndex]);
                    }
                    break;
                case '-':
                    String numB =  nums[++numIndex];
                    if ("-".equals(result.substring(0,1))){
                        String numA = expunge(result) ;
                        result = additionStr(numA, numB);
                        result = "-"+result;
                    } else {
                        String numA = result ;
                        if (isLeftBig(numA,numB)){
                            result = subtractionStr(numA, numB);
                        }else {
                            result = subtractionStr(numB, numA);
                            result = "-"+result;
                        }
                    }
                    break;
                case '=':
                    return result;// 这里返回结果
                default:
                    // ignore
            }
        }

        return result;
    }

    // add 加法
    private static String additionStr(String a, String b) {
        StringBuilder builder = new StringBuilder();
        a = reverse(a);
        b = reverse(b);
        // 调换
        if (a.length() < b.length()) {
            String c = b;
            b = a;
            a = c;
        }
        int aLen = a.length();
        int bLen = b.length();

        boolean isOver = false;
        for (int i = 0; i < aLen; i++) {
            int result = 0;
            int charA = a.charAt(i) - 48;
            if (i < bLen) {
                int charB = b.charAt(i) - 48;
                result = charA + charB;
            } else {
                result = result + charA;
            }
            // 进位
            if (isOver) {
                result++;
            }
            if (result >= 10) {
                builder.append(result - 10);
                isOver = true;
            } else {
                builder.append(result);
                isOver = false;
            }
        }
        if (isOver){
            builder.append("1");
        }
        return reverse(builder.toString());
    }

    // sub 减法
    private static String subtractionStr(String a, String b) {
        StringBuilder builder = new StringBuilder();
        a = reverse(a);
        b = reverse(b);
        // 调换
        if (a.length() < b.length()) {
            throw new IllegalArgumentException("字符串有误");
        }

        int aLen = a.length();
        int bLen = b.length();
        byte isOver = 0;//  借位

        for (int i = 0; i < aLen; i++) {
            int result = 0;
            int charA = a.charAt(i) - 48;
            result = result + isOver;
            isOver = 0;
            if (i < bLen) {
                int charB = b.charAt(i) - 48;
                result = result + charA;
                if (result < 0) {
                    result += 10;
                    isOver--;
                }
                result = result - charB;
                if (result < 0) {
                    result += 10;
                    isOver--;
                }
            } else {
                result = charA + result;
                if (result < 0) {
                    result += 10;
                    isOver--;
                }
            }
            builder.append(result);
        }
        return expungeZero(reverse(builder.toString()));
    }

    // 反序
    private static String reverse(String value) {
        if (value == null || value.length() <= 1) {
            return value;
        }
        return reverse(value.substring(1)) + value.charAt(0);
    }

    // 取零的前缀
    private static String expungeZero(String s) {
        return s.replaceFirst("^0*", "");
    }

    private static String expunge(String s){
        return s.replaceFirst("^-*", "");
    }

    private static boolean isLeftBig(String a,String b){
        if (a.length() == b.length()){
            return a.compareTo(b)>0;
        }
        if (a.length() > b.length()){
            return true;
        }
        return false;
    }

}

猜你喜欢

转载自www.cnblogs.com/immer/p/11209787.html