Java如何不使用循环仅用if/switch改写并修复单词统计代码
Java单词统计无循环改写方案
原代码存在的问题
- 未做空指针、空字符串校验,输入
""或null时会触发数组越界异常 - 依赖for循环实现字符遍历,不符合无循环要求
改写思路
使用递归调用替代循环实现字符遍历,全程仅通过if分支做逻辑判断,完全不使用for/while/do-while等循环结构,同时100%保留原代码「连续字母序列计为1个单词」的统计规则。
改写后可运行代码
public static int countWords(String s) { // 修复原代码空输入异常问题 if (s == null || s.isEmpty()) { return 0; } // 调用递归方法完成统计,初始状态:下标0、未在单词中、计数0 return countWordsRecursive(s, 0, false, 0); } private static int countWordsRecursive(String s, int currentIndex, boolean inWord, int currentCount) { int endOfLine = s.length() - 1; // 递归终止条件:遍历完所有字符直接返回计数 if (currentIndex >= s.length()) { return currentCount; } char currentChar = s.charAt(currentIndex); if (Character.isLetter(currentChar) && currentIndex != endOfLine) { // 当前是字母且非末尾,标记进入单词中,递归下一个字符 return countWordsRecursive(s, currentIndex + 1, true, currentCount); } else if (!Character.isLetter(currentChar) && inWord) { // 当前非字母且之前在单词中,计数+1,标记不在单词中,递归下一个字符 return countWordsRecursive(s, currentIndex + 1, false, currentCount + 1); } else if (Character.isLetter(currentChar) && currentIndex == endOfLine) { // 当前是末尾的字母,计数+1,递归结束 return countWordsRecursive(s, currentIndex + 1, false, currentCount + 1); } else { // 其他情况(非字母且不在单词中),直接递归下一个字符 return countWordsRecursive(s, currentIndex + 1, inWord, currentCount); } }
功能验证
和原代码逻辑完全对齐:
- 输入
"hello world"返回2 - 输入
" hello java123test "返回3(连续字母序列为hello、java、test) - 输入
"a"返回1 - 输入
""返回0 - 输入
null返回0
内容的提问来源于stack exchange,提问作者A.B
相关产品推荐
相关产品推荐

