Java 颠倒字符串中的某些单词

Java 颠倒字符串中的某些单词,java,Java,我需要在给定字符串中反转5个或更多字符长的单词。例如: *给定字符串:我的名字是迈克尔。 *输出:我的名字是leahciM 句子的其余部分保持不变,只是那些长单词被颠倒了过来 到目前为止,我得出了以下结论: public static String spinWords(String sentence) { String[] splitWords = sentence.split(" "); String reversedSentence = ""; String reve

我需要在给定字符串中反转5个或更多字符长的单词。例如: *给定字符串:我的名字是迈克尔。 *输出:我的名字是leahciM

句子的其余部分保持不变,只是那些长单词被颠倒了过来

到目前为止,我得出了以下结论:

public static String spinWords(String sentence) {
    String[] splitWords = sentence.split(" ");
    String reversedSentence = "";
    String reversedWord = "";
    for (String str : splitWords) {
        if (str.length() >= 5) {
            for (int i = str.length() - 1; i >= 0; i--)
                reversedWord += (str.charAt(i) + " ");
        }
    }
}
我把这些话倒过来了,但是 1它们在一个字符串中,没有空格 2我不知道如何将它们放回字符串中的位置,这里有一个建议:

编写一个反转字符串的方法:

private static String reverse(String s) { ... }
然后在main方法中,在必要时调用它:

if (str.length() >= 5) str = reverse(str);
然后,您需要将这些单词重新组合在一起,大概放在倒转的句子字符串中:

旁注:

对于较长的句子,使用StringBuilder可能比字符串连接更有效。 您可以将所有单词放回循环中的列表中,并在循环后调用reversedSession=String.join,List 可以在一行中反转字符串-您应该可以在stackoverflow上找到许多相关的Q&a。 这里有一个建议:

编写一个反转字符串的方法:

private static String reverse(String s) { ... }
然后在main方法中,在必要时调用它:

if (str.length() >= 5) str = reverse(str);
然后,您需要将这些单词重新组合在一起,大概放在倒转的句子字符串中:

旁注:

对于较长的句子,使用StringBuilder可能比字符串连接更有效。 您可以将所有单词放回循环中的列表中,并在循环后调用reversedSession=String.join,List 可以在一行中反转字符串-您应该可以在stackoverflow上找到许多相关的Q&a。 您可以使用StringBuilder

您可以使用StringBuilder


不需要使用任何你几乎拥有的东西,只需检查循环并记住添加未反转的字符串

public static String spinWords(String sentence) {
    String[] splitWords = sentence.split(" ");
    String reversedSentence = "";
    String reversedWord;
    for (String str : splitWords) {
        if (str.length() >= 5) {
            reversedWord = "";
            for (int i = str.length() - 1; i >= 0; i--) {
                reversedWord += (str.charAt(i));
            }
            reversedSentence += " " + reversedWord;
        } else {
            reversedSentence += " " + str;
        }
    }
    return reversedSentence;
}

不需要使用任何你几乎拥有的东西,只需检查循环并记住添加未反转的字符串

public static String spinWords(String sentence) {
    String[] splitWords = sentence.split(" ");
    String reversedSentence = "";
    String reversedWord;
    for (String str : splitWords) {
        if (str.length() >= 5) {
            reversedWord = "";
            for (int i = str.length() - 1; i >= 0; i--) {
                reversedWord += (str.charAt(i));
            }
            reversedSentence += " " + reversedWord;
        } else {
            reversedSentence += " " + str;
        }
    }
    return reversedSentence;
}
在处理splitWords中的元素时,使用StringBuilder生成答案

你也可能会发现具有特殊首次价值的空间习惯用法很有用

您的原始代码中也有一个bug

下面是我要做的:

public class ReverseLongWord {

    public static void main(String[] args) {
        String testInput = "My name is Michael";

        System.out.println(spinWords(testInput));

    }

    public static String spinWords(String sentence) {
        String[] splitWords = sentence.split(" ");
        String reversedSentence = "";
        StringBuilder sb = new StringBuilder();
        String space = "";              // first time special
        String reversedWord = "";
        for (String str : splitWords) {
            if (str.length() >= 5) {
                for (int i = str.length() - 1; i >= 0; i--) {
                    reversedWord += (str.charAt(i));    // Bug fixed
                }
                sb.append(space + reversedWord);
            } else {
                sb.append(space + str);
            }
            space = " ";                // second time and onwards
        }
        return sb.toString();
    }

}
如您所指定,此程序的输出如下:

My name is leahciM
在处理splitWords中的元素时,使用StringBuilder生成答案

你也可能会发现具有特殊首次价值的空间习惯用法很有用

您的原始代码中也有一个bug

下面是我要做的:

public class ReverseLongWord {

    public static void main(String[] args) {
        String testInput = "My name is Michael";

        System.out.println(spinWords(testInput));

    }

    public static String spinWords(String sentence) {
        String[] splitWords = sentence.split(" ");
        String reversedSentence = "";
        StringBuilder sb = new StringBuilder();
        String space = "";              // first time special
        String reversedWord = "";
        for (String str : splitWords) {
            if (str.length() >= 5) {
                for (int i = str.length() - 1; i >= 0; i--) {
                    reversedWord += (str.charAt(i));    // Bug fixed
                }
                sb.append(space + reversedWord);
            } else {
                sb.append(space + str);
            }
            space = " ";                // second time and onwards
        }
        return sb.toString();
    }

}
如您所指定,此程序的输出如下:

My name is leahciM

我认为一些人建议的反向方法是最简单的方法,这里我分享我的实现

public static void main(String[] args) {
    System.out.println(concatenatePhrase("My name is Michael"));
    System.out.println(concatenatePhrase("Some randoms words with differents sizes and random words"));
}

private static String concatenatePhrase(String phrase) {
    StringBuilder completePhrase = new StringBuilder();
    String[] phrases = phrase.split(" ");
    for (String word : phrases) {
        if (word.length() >= 5) {
            completePhrase.append(reverseWord(word).append(" "));
        } else {
            completePhrase.append(word).append(" ");
        }
    }
    return completePhrase.toString().trim();
}

private static StringBuilder reverseWord(String wordPassed) {
    StringBuilder word = new StringBuilder(wordPassed);
    return word.reverse();
}

我认为一些人建议的反向方法是最简单的方法,这里我分享我的实现

public static void main(String[] args) {
    System.out.println(concatenatePhrase("My name is Michael"));
    System.out.println(concatenatePhrase("Some randoms words with differents sizes and random words"));
}

private static String concatenatePhrase(String phrase) {
    StringBuilder completePhrase = new StringBuilder();
    String[] phrases = phrase.split(" ");
    for (String word : phrases) {
        if (word.length() >= 5) {
            completePhrase.append(reverseWord(word).append(" "));
        } else {
            completePhrase.append(word).append(" ");
        }
    }
    return completePhrase.toString().trim();
}

private static StringBuilder reverseWord(String wordPassed) {
    StringBuilder word = new StringBuilder(wordPassed);
    return word.reverse();
}

有没有办法去掉最后的空间?我真的很喜欢你的方法,不起诉StringBuilder,我不认为我可以在codewars中使用其他库。@doublemc你可以将所有单词放回循环中的列表中,并调用ReversedSession=String.join,在循环后列出或使用Stringtrim@doublemc一个技巧是在你的循环中有一个布尔值firstWord=true:如果firstWord{result=str;firstWord=false;}或者{result+=+str;}@assylias老实说,我刚刚检查了一下,如果我有一个很长的第一个词,例如Michael是我的名字,它不会颠倒过来。我应该把它放在哪里?从现在开始:@assylias好吧,刚刚使用了方法trim,效果非常好!有没有办法去掉最后的空间?我真的很喜欢你的方法,不起诉StringBuilder,我不认为我可以在codewars中使用其他库。@doublemc你可以将所有单词放回循环中的列表中,并调用ReversedSession=String.join,在循环后列出或使用Stringtrim@doublemc一个技巧是在你的循环中有一个布尔值firstWord=true:如果firstWord{result=str;firstWord=false;}或者{result+=+str;}@assylias老实说,我刚刚检查了一下,如果我有一个很长的第一个词,例如Michael是我的名字,它不会颠倒过来。我应该把它放在哪里?从现在开始:@assylias好吧,刚刚使用了方法trim,效果非常好!