字符串展开程序输出不符合预期,如何修正代码?
问题:字符串展开结果字符重复过多,如何修正?
输入字符串:a2b3c1
预期输出:aabbbc
实际输出:aaabbbbcc
不清楚程序为何多打印字母字符,请问该修改哪部分代码以得到正确输出?
原程序代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.regex.Pattern; import java.util.regex.Matcher; public class stringExpansionAndCompression { public void getStringInput() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter the String value: "); String inputStr = reader.readLine(); String output = stringExpansionRegEx(inputStr); System.out.println(output); } public String stringExpansionRegEx(String str) { StringBuilder result = new StringBuilder(); Pattern pattern = Pattern.compile("([a-zA-Z]\\d)+"); Matcher match = pattern.matcher(str); boolean bool = Pattern.matches("([a-zA-Z]\\d)+", str); if (bool = true){ for (int i=0;i<str.length();i++) { char ch = str.charAt(i); int count = Integer.parseInt(String.valueOf(str.charAt(i+1))); for (int j = 0; j <= count; j++) { result.append(ch); } i=i+1; } } return result.toString(); } }
问题原因及修改方案
- 字符重复过多的核心原因:内层循环的终止条件错误。原代码中
j <= count会让循环执行count+1次(比如count=2时,j取0、1、2,共3次),导致字符多输出一次。需要将其改为j < count,这样循环正好执行count次,符合预期。 - 次要逻辑错误:
if (bool = true)是赋值操作而非判断操作,会导致条件永远为真,应该修改为if (bool)或者if (bool == true)。
修改后的代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.regex.Pattern; import java.util.regex.Matcher; public class stringExpansionAndCompression { public void getStringInput() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter the String value: "); String inputStr = reader.readLine(); String output = stringExpansionRegEx(inputStr); System.out.println(output); } public String stringExpansionRegEx(String str) { StringBuilder result = new StringBuilder(); Pattern pattern = Pattern.compile("([a-zA-Z]\\d)+"); Matcher match = pattern.matcher(str); boolean bool = Pattern.matches("([a-zA-Z]\\d)+", str); if (bool){ // 修正判断逻辑 for (int i=0;i<str.length();i++) { char ch = str.charAt(i); int count = Integer.parseInt(String.valueOf(str.charAt(i+1))); for (int j = 0; j < count; j++) { // 修正循环终止条件 result.append(ch); } i=i+1; } } return result.toString(); } }
内容的提问来源于stack exchange,提问作者Urekha Rajendran
相关产品推荐
相关产品推荐

