Java实现句子5字母以上单词反转时部分单词丢失问题求解
问题原因
- 循环边界逻辑错误:
spinWords方法中的for循环每次迭代都会重新计算当前sentence的单词数,而你每处理一个单词就会截掉sentence的第一个单词,wordCount(sentence)的返回值会持续变小,导致循环实际执行次数远小于初始句子的总单词数,直接造成后面的单词被遗漏。 - 最后一个单词处理逻辑缺失:你每次通过
sentence.indexOf(' ')获取第一个空格的位置来切割单词,当处理到最后一个单词时,sentence中已经没有空格,indexOf(' ')会返回-1,此时调用substring(0, -1)会直接抛出字符串索引越界异常,就算没有触发异常,最后一个单词也不会被正常处理。 - 循环次数冗余:就算你用初始单词数作为固定边界,
i <= 单词数的写法也会多执行一次循环,会导致多余的空字符串处理。
修复方案
建议先把原句子按空格切割成固定的单词数组,再遍历数组处理每个单词,逻辑会清晰很多,修复后的参考代码如下:
public static String spinWords(String sentence) { // 先把句子按空格切割成单词数组,固定长度不会变 String[] words = sentence.split(" "); StringBuilder ans = new StringBuilder(); for (int i = 0; i < words.length; i++) { String word = words[i]; if (word.length() >=5) { ans.append(reverseString(word)); } else { ans.append(word); } // 除了最后一个单词,其他后面加空格 if (i != words.length -1) { ans.append(" "); } } return ans.toString(); }
如果你要保留原来的切割逻辑,也可以先计算初始单词数作为固定循环边界,再单独处理最后一个单词:
public static String spinWords(String sentence) { String ans = ""; // 先拿到初始的总单词数,作为固定循环边界 int totalWord = wordCount(sentence); // 循环次数是总单词数减1,留最后一个单词单独处理 for(int i = 0; i < totalWord - 1; i++) { int spaceIndex = sentence.indexOf(' '); String word = sentence.substring(0, spaceIndex); if(word.length() >= 5) { ans += reverseString(word) + " "; } else { ans += word + " "; } sentence = sentence.substring(spaceIndex + 1); } // 处理最后一个单词 ans += sentence.length() >=5 ? reverseString(sentence) : sentence; return ans; }
内容的提问来源于stack exchange,提问作者CiY3
相关产品推荐
相关产品推荐

