为什么有些单词没有被检查或包含在反转单词的字符串中?

why are some words not checked or included in string of reversed words?

大家。我有一个任务——反转句子中的每个单词,只要单词长度为 5 个或更多个字母。该程序一直在处理大多数单词,但在几次之后,这些单词不包括在内。有谁知道为什么会这样?这是代码:

public static int wordCount(String str) {
    int count = 0;
    for(int i = 0; i < str.length(); i++) if(str.charAt(i) == ' ') count++;
    return count + 1;
}

这只是为我计算字数,稍后我在 for 循环中使用它来遍历所有字词。

public static String reverseString(String s) {
    Stack<Character> stack = new Stack<>();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        stack.push(s.charAt(i));
    }
    while (!stack.empty()) {
        sb.append(stack.pop());
    }
    return sb.toString();
}

这将反转单个字符串。这不是我反转某些单词的地方——这是反转字符串。从 .

“借来”

最后,实际功能:

public static String spinWords(String sentence) {
    String ans = "";
    for(int i = 0; i <= wordCount(sentence); i++) {
        if(sentence.substring(0, sentence.indexOf(' ')).length() >= 5) {
            ans += reverseString(sentence.substring(0, sentence.indexOf(' '))) + " ";
            sentence = sentence.substring(sentence.indexOf(' ') + 1);
        } else {
            ans += sentence.substring(0, sentence.indexOf(' ')) + " ";
            sentence = sentence.substring(sentence.indexOf(' ') + 1);
        }
    }
    return ans;
}

这可能是我的错误所在。我想知道为什么有些词被省略了。为了以防万一,这是我的主要方法:

public static void main(String[] args) {
    System.out.println(spinWords("Why, hello there!"));
    System.out.println(spinWords("The weather is mighty fine today!"));
}

告诉我为什么会这样。谢谢!

我认为您应该使用 String.split() 重写大量代码。您无需手动解析每个字母,只需编写 String[] arr = sentence.split(" ") 即可获得每个单词的数组。然后,您可以使用 for 循环遍历并反转每个单词,如下所示

for (int i=0; i<arr.length; i++) {
    if (arr[i] >= 5) {
        arr[i] = reverse(arr[i])
    }
}

我知道您只是要求解决当前代码的问题,但这可能会让您获得更好的成绩:)

主要问题似乎是 spinWords() 中的 for 循环条件

你的句子字数越来越短,同时i却越来越多。

例如:

  • 字数为5时i为0
  • 字数为4时i为1
  • 字数为3时i为2
  • 当字数为 2 时,i 为 3 停止循环。

整个句子都说不完

正如许多人提到的,使用拆分方法会有很大帮助,例如:

public static String spinWords(String sentence) {
    StringJoiner ans = new StringJoiner(" ");
    List<String> words = Arrays.asList(sentence.split(" "));
    words.forEach(word -> ans.add(word.length() < 5 ? word : new StringBuilder(word).reverse().toString()));
    return ans.toString();
}