Java中split方法拆分含多位数表达式时出现空元素问题求助
解决Java拆分算术表达式时运算符数组出现空元素的问题
问题原因
你当前用split("[0123456789]")拆分运算符时,多位数的连续数字会被多次匹配拆分。比如输入12+34,拆分后会得到["", "+", "", ""]——因为1和2都是数字,拆分后它们之间会产生空字符串,后续只从索引1开始添加元素,会把这些空字符串也带进op数组,导致出现空元素。
修复方案
方案1:过滤空字符串
在构建op数组时,不仅跳过无效的起始元素,还要判断元素是否为空,只保留非空的运算符:
ArrayList<String> op = new ArrayList<>(); for(int i = 0; i < preop.length; i++) { String s = preop[i]; if(!s.isEmpty()) { // 过滤空字符串 op.add(s); } }
方案2:直接匹配运算符(更高效)
不用通过拆分数字间接获取运算符,而是用正则直接匹配所有目标运算符(+、-、*、/),结果更准确:
// 用正则匹配所有运算符 Pattern opPattern = Pattern.compile("[+\\-*/]"); Matcher matcher = opPattern.matcher(expression); ArrayList<String> op = new ArrayList<>(); while(matcher.find()) { op.add(matcher.group()); }
方案3:一次性提取数字和运算符(推荐)
如果最终要把数字和运算符按原顺序组合,最可靠的方式是用正则同时匹配多位数和运算符,一次遍历就能得到完整的拆分列表,避免拆分后再合并的冗余步骤:
ArrayList<String> exp = new ArrayList<>(); // 匹配多位数(\\d+)或任意运算符 Pattern pattern = Pattern.compile("\\d+|[+\\-*/]"); Matcher matcher = pattern.matcher(expression); while(matcher.find()) { exp.add(matcher.group()); } System.out.println("最终拆分结果: " + exp);
这个正则能精准识别一位/多位数,以及所有目标运算符,完全保留原表达式的顺序。
完整优化后的代码示例
import java.util.ArrayList; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Model { private Scanner sc = new Scanner(System.in); private String expression; public Model() { expression = sc.nextLine(); split(); } public void split() { ArrayList<String> exp = new ArrayList<>(); Pattern pattern = Pattern.compile("\\d+|[+\\-*/]"); Matcher matcher = pattern.matcher(expression); while(matcher.find()) { exp.add(matcher.group()); } System.out.println("拆分结果: " + exp); } public static void main(String[] args) { new Model(); } }
测试输入123+45*6-78/9,输出为[123, +, 45, *, 6, -, 78, /, 9],完全符合预期。
内容的提问来源于stack exchange,提问作者IamTufa
相关产品推荐
相关产品推荐

