Java单词统计代码计数结果不符合预期的错误原因排查
错误原因分析
- 逻辑运算符使用错误:判断下一个字符是否为非分隔符时,错误使用了
||(或)运算符。该条件永远为真,因为单个字符不可能同时等于所有分隔符,哪怕下一个字符仍是分隔符,也会触发计数+1,导致连续分隔符场景下计数远大于预期。 - 初始值设置不合理:初始计数
numWords = 1没有考虑空字符串、字符串开头就是分隔符的场景,比如开头为!的测试用例会多算1次。 - 边界逻辑缺失:没有处理开头为分隔符的识别逻辑,仅判断当前字符是分隔符、下一个字符不是就计数,无法兼容连续分隔符、前缀分隔符的场景。
修正方案
核心逻辑调整为:仅当分隔符后第一次出现非分隔符时计数+1,避免连续分隔符重复计数,同时兼容前缀分隔符、空字符串场景。
修正后的代码如下:
public class WordCounter { // 统一判断是否为分隔符,避免重复冗余代码 private static boolean isDelimiter(char c) { return c == '.' || c == ':' || c == ';' || c == '?' || c == '!' || c == ' ' || c == '\n' || c == '\t'; } public static void words(String text) { // 空输入直接返回0 if (text == null || text.isEmpty()) { System.out.println("Number of words: 0"); return; } int numWords = 0; // 初始状态默认前面是分隔符,开头第一个非分隔符就会触发计数 boolean previousIsDelimiter = true; for (int i = 0; i < text.length(); i++) { char currentChar = text.charAt(i); if (isDelimiter(currentChar)) { previousIsDelimiter = true; } else { // 只有前一个字符是分隔符、当前是非分隔符时才计数 if (previousIsDelimiter) { numWords++; previousIsDelimiter = false; } } } System.out.println("Number of words: " + numWords); } }
测试结果验证
- 测试用例1:
"Is this_one_long_word or several??? What do you think?? Too much"输出结果为10,符合预期 - 测试用例2:
"!This uses periods.as.word.delimiters and can be tricky."输出结果为10,符合预期 - 额外测试用例:
"I_don't_like_to_use_SPACES-EVER!"输出结果为1,符合预期
内容的提问来源于stack exchange,提问作者mr struggle
相关产品推荐
相关产品推荐

