You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算器开发问题:如何修改Java代码计算2*5*7+1+4并在TextView显示结果

解决计算器带优先级运算的问题

嘿,我来帮你搞定这个计算器的问题!你的现有代码只是把输入的表达式拆分成了数字和运算符的列表,但还没实现带运算优先级的计算逻辑——这就是你需要补充的核心部分。咱们一步步修改:

问题分析

你的代码已经完成了表达式拆分的工作,比如输入2*5*7+1+4会被拆成["2", "*", "5", "*", "7", "+", "1", "+", "4"]。但如果直接从左到右计算,虽然这个例子结果碰巧正确,但遇到2+5*7这种需要先算乘除的情况就会出错。所以我们必须先处理所有乘除运算,再处理加减运算,才能符合数学运算规则。

修改后的完整代码

s1 = (edt1.getText()+"");
ArrayList<String> buffer = new ArrayList<String>();
String temp = "";

// 第一步:拆分表达式为数字和运算符列表(优化原有的拆分逻辑)
for (int j = 0; j < s1.length(); j++) {
    if (Character.isDigit(s1.charAt(j)) || s1.charAt(j) == '.') {
        char c1 = s1.charAt(j);
        temp = temp + String.valueOf(c1);
    }
    // 改成else if,避免同一个字符触发两个判断逻辑,让代码更严谨
    else if (s1.charAt(j) == '+' || s1.charAt(j) == '-' || s1.charAt(j) == '*' || s1.charAt(j) == '/') {
        buffer.add(temp);
        temp = "";
        buffer.add(String.valueOf(s1.charAt(j)));
    }
}
buffer.add(temp);

// 第二步:优先处理乘除运算(优先级高于加减)
int i = 0;
while (i < buffer.size()) {
    String op = buffer.get(i);
    if (op.equals("*") || op.equals("/")) {
        // 获取运算符前后的数字
        double num1 = Double.parseDouble(buffer.get(i-1));
        double num2 = Double.parseDouble(buffer.get(i+1));
        double result = 0;
        
        if (op.equals("*")) {
            result = num1 * num2;
        } else if (op.equals("/")) {
            // 增加除数不为0的判断,避免程序崩溃
            if (num2 != 0) {
                result = num1 / num2;
            } else {
                // 这里可以换成你需要的错误提示逻辑
                textView.setText("错误:除数不能为0");
                return;
            }
        }
        
        // 用计算结果替换掉运算符和前后两个数字
        buffer.set(i-1, String.valueOf(result));
        buffer.remove(i);
        buffer.remove(i); // 移除后原i+1位置的元素会前移到i,所以再移除一次
        i--; // 回退索引,避免跳过相邻的乘除运算
    }
    i++;
}

// 第三步:处理剩余的加减运算
double finalResult = Double.parseDouble(buffer.get(0));
i = 1;
while (i < buffer.size()) {
    String op = buffer.get(i);
    double num = Double.parseDouble(buffer.get(i+1));
    
    if (op.equals("+")) {
        finalResult += num;
    } else if (op.equals("-")) {
        finalResult -= num;
    }
    
    i += 2; // 每次跳过运算符和数字,步进2
}

// 将最终结果显示到TextView
textView.setText(String.valueOf(finalResult));

关键修改点说明

  • 拆分逻辑优化:把第二个if改为else if,避免运算符字符同时触发数字判断的分支,逻辑更严谨。
  • 乘除优先计算:遍历拆分后的列表,遇到*或/就立即计算前后数字的结果,替换掉这三个元素,直到所有乘除运算处理完毕。
  • 加减顺序计算:乘除处理完成后,列表里只剩下加减运算符和数字,直接从左到右依次计算即可。
  • 异常处理:增加了除数为0的判断,避免程序崩溃,你可以根据需求调整错误提示的样式。

这样修改后,输入2*5*7+1+4会先算出2*5=10,再算10*7=70,接着70+1=71,最后71+4=75,得到正确结果;如果输入2+5*7,也会先计算5*7=35,再算出2+35=37,完全符合数学运算优先级规则。

内容的提问来源于stack exchange,提问作者shyam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:32:30