为啥有些单词没有被检查或包含在反向单词字符串中?

Posted

技术标签:

【中文标题】为啥有些单词没有被检查或包含在反向单词字符串中?【英文标题】:why are some words not checked or included in string of reversed words?为什么有些单词没有被检查或包含在反向单词字符串中? 【发布时间】:2022-01-07 16:45:21 【问题描述】:

每个人。我有一个任务 - 只要单词长度为 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();

这会反转单个字符串。这不是我颠倒某些单词的地方——这会颠倒一个字符串。从https://***.com/a/33458528/16818831“借来的”。

最后,实际功能:

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!"));

让我知道为什么会发生这种情况。谢谢!

【问题讨论】:

你尝试调试了吗? @shmosel 抱歉,我没有说明到目前为止我为解决此问题所做的工作。我在 spinWords 函数中更改了 for 循环中的条件,我试图查看是否有任何双簧管,一堆东西。很多这样的“解决方案”只是让输出进一步离题。 您能否确认Why, hello there! 的预期输出是Why, olleh !ereht 如果你使用"Why, hello there!".split (" ");,你的代码也会简单很多 把 wordCount(sentence) 作为一个单独的变量 【参考方案1】:

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

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

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

【讨论】:

非常感谢 :D 这不是学校作业,但谢谢你的想法! arr[i] &gt;= 5 - 什么? 我认为他的意思是 arr[i].length()。【参考方案2】:

主要问题似乎是 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();

【讨论】:

以上是关于为啥有些单词没有被检查或包含在反向单词字符串中?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript/jQuery 检查字符串是不是包含一个单词或出现的可选单词之一

字符串包含拉长的单词

用于检查字符串是不是不应包含某些单词的正则表达式,但如果这些单词前面有“to”或“for”,则这些单词是可以的

2021-10-15:单词拆分。给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你

如何在不使用 VBA 的情况下在 Excel 中执行反向字符串搜索?

为啥Word,ppt有的字下面会出现红色波浪