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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:39:04