Java整数count异常递增问题:ASCII艺术压缩函数输出不符
问题原因与修复方案
1. 数值跳变的直接原因:错用八进制格式化符
你代码里的String.format("%o,", count)犯了一个关键错误——%o是八进制整数的格式化符号,不是十进制!
十进制和八进制的对应关系刚好解释了你看到的跳变:
- 十进制7 → 八进制显示为7
- 十进制8 → 八进制显示为10
- 十进制9 → 八进制显示为11
- 十进制10 → 八进制显示为12
所以你看到count从7“跳”到10,实际是count增长到8时被转成了八进制的10;最终统计到10个'@',被格式化成八进制的12,这就是输出里出现12的原因。
2. 初始逻辑的合理性说明
你的需求是按fileChars的顺序输出连续字符数,第一个要统计的是fileChars[0](即'-')的连续次数。因为输入line开头是'@',和初始的lastChar='-'不匹配,所以第一次循环会输出初始的count=0(对应'-'的连续次数),这部分是符合预期的,问题出在后续的数值格式化上。
修复后的代码
把%o改成十进制格式化符%d,同时用StringBuilder代替String拼接提升性能:
public String compressLine(String line, char[] fileChars){ StringBuilder outputLine = new StringBuilder(); int count = 0; char lastChar = fileChars[0]; for(char c : line.toCharArray()){ if(c!=lastChar){ outputLine.append(String.format("%d,", count)); lastChar = c; count = 1; }else{ count += 1; } } outputLine.append(count); return outputLine.toString(); }
验证结果
用你的测试输入line="@@@@@@@@@@---"、fileChars=[-, @],修复后的代码会输出0,10,3,完全符合预期。
内容的提问来源于stack exchange,提问作者Onur
相关产品推荐
相关产品推荐

