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

Java初学者求助:将含多位数的表达式字符串转为ArrayList/数组

解决Java中数学表达式拆分为完整Token的问题

Hey there! I get that you're just starting out with Java and programming, and you've run into a common snag when trying to split a math expression string—using toCharArray() splits multi-digit numbers like 10 into '1' and '0', which isn't what you want. Let's fix that with two straightforward approaches that'll give you the ArrayList of complete tokens you're aiming for.

方法1:使用正则表达式(简洁高效)

正则表达式是快速匹配符合规则的字符串片段的好工具。我们可以定义一个规则,匹配一个或多个连续数字,或者括号/运算符,这样就能把多位数完整提取出来。

示例代码

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ExpressionTokenizer {
    public static void main(String[] args) {
        String s = "(((1+2))-((5+6))-((10+20))-((6-18))+((9+10)))";
        ArrayList<String> tokens = new ArrayList<>();
        
        // 正则规则:匹配多位数(\d+) 或 运算符/括号([-+()])
        Pattern tokenPattern = Pattern.compile("\\d+|[-+()]");
        Matcher matcher = tokenPattern.matcher(s);
        
        // 遍历所有匹配到的token,加入列表
        while (matcher.find()) {
            tokens.add(matcher.group());
        }
        
        // 输出结果,和你的预期格式一致
        System.out.println(tokens);
    }
}

代码解释

  • \\d+:匹配一个或多个连续的数字(比如10、20会被完整匹配)
  • |:逻辑“或”,用来分隔不同的匹配规则
  • [-+()]:匹配括号和加减运算符
  • matcher.find():逐个查找字符串中符合规则的片段,matcher.group()获取当前匹配到的内容

方法2:手动遍历字符串(适合理解底层逻辑)

如果你想更清楚地了解拆分过程,手动遍历字符串是个很好的学习方式。我们会逐个检查字符,遇到数字时就收集所有连续的数字,遇到括号/运算符则直接加入列表。

示例代码

import java.util.ArrayList;

public class ManualExpressionTokenizer {
    public static void main(String[] args) {
        String s = "(((1+2))-((5+6))-((10+20))-((6-18))+((9+10)))";
        ArrayList<String> tokens = new ArrayList<>();
        int index = 0;
        
        while (index < s.length()) {
            char currentChar = s.charAt(index);
            
            // 如果当前字符是数字,收集连续的数字
            if (Character.isDigit(currentChar)) {
                StringBuilder numberBuilder = new StringBuilder();
                // 一直往后读,直到遇到非数字字符
                while (index < s.length() && Character.isDigit(s.charAt(index))) {
                    numberBuilder.append(s.charAt(index));
                    index++;
                }
                tokens.add(numberBuilder.toString());
            } else {
                // 非数字字符(括号、运算符)直接转成字符串加入列表
                tokens.add(String.valueOf(currentChar));
                index++;
            }
        }
        
        System.out.println(tokens);
    }
}

代码解释

  • 用index变量跟踪当前遍历的位置
  • 遇到数字时,用StringBuilder拼接所有连续的数字,确保多位数不会被拆分
  • 遇到括号或运算符时,直接把字符转成字符串加入列表,然后移动到下一个字符

两种方法运行后,都会输出你预期的格式:

[(, (, (, 1, +, 2, ), ), -, (, (, 5, +, 6, ), ), -, (, (, 10, +, 20, ), ), -, (, (, 6, -, 18, ), ), +, (, (, 9, +, 10, ), ), )]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:17:53