游乐游手机版
首页/编程语言/文章详情

Java中按顺序合并数字与运算符列表执行四则运算

时间:2026-08-03 21:50
将分离的数字与运算符列表按输入顺序配对,自左向右依次执行加减乘除运算,无算术优先级。实现中通过强校验确保列表长度匹配、操作符合法并防范除零异常,返回double类型结果,适用于简易计算器场景。
本文分享一种简洁高效的计算方法,能够将分离存储的数字字符串列表与运算符字符串列表按输入顺序依次合并并计算结果,支持加、减、乘、除运算,严格遵循从左到右的运算顺序(不包含算术优先级),特别适用于简易计算器场景。

在开发基于用户输入的简易计算器时,常常会遇到这样一个典型场景:输入被解析成两个独立的列表——一个存放数字(例如 ["10", "5", "3", "2"]),另一个存放运算符(例如 ["+", "*", "-"])。那么,如何安全、清晰且易于维护地将它们配对并按顺序计算呢?请注意,这里不考虑算术优先级(即先乘除后加减),而是严格遵循“从左到右依次应用运算符”的规则,其计算结果等价于 (10 + 5) * 3 - 2 = 43.0。

下面提供一个健壮且类型安全的实现方案,直接查看代码:

import ja va.util.*;

public class SimpleCalculator {
    /**
     * 按顺序计算数字与运算符列表:result = ((num₀ op₀ num₁) op₁ num₂) op₂ num₃ ...
     * @param numbers 非空数字字符串列表(至少含1个元素),将被修改(首元素被移除)
     * @param operators 运算符字符串列表,长度必须等于 numbers.size() - 1
     * @return 计算结果(double 类型)
     */
    public static double evaluate(List numbers, List operators) {
        if (numbers == null || numbers.isEmpty()) {
            throw new IllegalArgumentException("数字列表不能为空");
        }
        if (operators == null || operators.size() != numbers.size() - 1) {
            throw new IllegalArgumentException(
                "运算符数量必须比数字数量少1,当前:数字=" + numbers.size() + ",运算符=" + operators.size()
            );
        }

        double result = Double.parseDouble(numbers.remove(0)); // 取出首个数字作为初始值
        for (int i = 0; i < operators.size(); i++) {
            double nextValue = Double.parseDouble(numbers.get(i));
            String opStr = operators.get(i);
            if (opStr.length() != 1) {
                throw new IllegalArgumentException("运算符必须为单字符,但得到: '" + opStr + "'");
            }
            char op = opStr.charAt(0);
            result = switch (op) {
                case '+' -> result + nextValue;
                case '-' -> result - nextValue;
                case '*' -> result * nextValue;
                case '/' -> {
                    if (nextValue == 0.0) {
                        throw new ArithmeticException("除零错误");
                    }
                    yield result / nextValue;
                }
                default -> throw new IllegalArgumentException("不支持的运算符: '" + op + "'");
            };
        }
        return result;
    }

    // 使用示例
    public static void main(String[] args) {
        List numbers = new ArrayList<>(Arrays.asList("10", "5", "3", "2"));
        List operators = List.of("+", "*", "-");
        double result = evaluate(numbers, operators);
        System.out.println(result); // 输出:43.0
    }
}

✅ 核心设计亮点:

  • 明确职责分离:numbers 列表提供操作数,operators 列表提供操作符,逻辑清晰易懂;
  • 强校验机制:在启动时检查列表长度匹配性、空值、非法字符以及除零情况,有效避免运行时崩溃;
  • 部分不可变输入保护:仅修改传入的 numbers 列表(移除首项),而 operators 列表保持完全只读;
  • 兼容性良好:接受任意 List 实现(如 ArrayList、ImmutableList 等),无需强制类型转换。

⚠️ 重要注意事项:

  • 该算法不实现标准算术优先级(例如 10 + 5 * 3 会被计算为 (10 + 5) * 3 = 45,而非 10 + (5 * 3) = 25)。如果需要算术优先级,请改用中缀表达式解析(如 Dijkstra 双栈算法)或构建抽象语法树(AST);
  • 所有数字和运算符均以字符串形式传入,便于与用户输入(例如 Scanner.nextLine())无缝对接;
  • 若需要支持负数、小数、括号或更复杂的表达式,建议迁移到成熟的解析库(如 JEP、exp4j)或自行编写递归下降解析器。

通过此方法,你不仅能可靠地完成“两列表合并计算”这一具体需求,还能建立起对表达式求值基础流程的清晰认知——这是构建健壮计算器的第一步。

来源:https://www.php.cn/faq/2812559.html
上一篇Go语言微服务项目配置项热更新完整实现指南 下一篇Java类加载机制与程序安全性的平衡策略
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
用 pytest-benchmark 建立可复现的性能基线:从对比到回归
编程语言 · 2026-10-09

用 pytest-benchmark 建立可复现的性能基线:从对比到回归

本文介绍如何利用 pytest-benchmark 为 Python 代码建立可重复的性能基准,通过基准测试、对比分析和结果验证定位性能差异,同时避免测试环境、数据规模和统计方式带来的误判。

Python数据清洗:缺失值处理与异常值检测
编程语言 · 2026-10-09

Python数据清洗:缺失值处理与异常值检测

系统掌握使用Python与Pandas进行数据清洗的方法,从识别缺失值、选择合理的填补或删除策略,到检测异常值并验证清洗效果,避免因盲目处理导致数据偏差。

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理
编程语言 · 2026-10-09

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理

在 SQLAlchemy 开发中,Session 不仅是对象状态的跟踪器,更是数据库事务的边界载体。许多数据不一致问题源于对 Session 生命周期、事务提交机制及异常回滚的误解。本文从 Session 的工作单元本质出发,解析 flush 与 commit 的行为差异,探讨并发场景下的请求级 S

Redis 与 Memcached 选型指南:从架构差异到生产实践
编程语言 · 2026-10-09

Redis 与 Memcached 选型指南:从架构差异到生产实践

本文不单纯比较 QPS 峰值,而是从架构原理出发,解析 Redis 与 Memcached 在数据模型、内存管理与并发处理上的本质差异。通过统一环境的基准测试与真实业务场景分析,揭示在 Session 存储、复杂数据结构及高并发读写下的性能表现与瓶颈。文章最后提供针对缓存穿透、雪崩及大 Key 问题

Linux服务器初始化:防火墙与SELinux策略配置
编程语言 · 2026-10-09

Linux服务器初始化:防火墙与SELinux策略配置

从服务器初始化安全基线出发,系统梳理防火墙规则与SELinux策略的配置、验证、联动排障及常见避坑方法,帮助在保证服务可用的同时建立合理的访问控制边界。