反转字符串中的某些单词

时间:2016-12-27 00:12:56

标签: java

我需要在给定字符串中反转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)我不知道如何将它们放回到字符串中的位置

5 个答案:

答案 0 :(得分:5)

这是一个建议:

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

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

    if (str.length() >= 5) str = reverse(str);
    
  • 然后你需要将这些单词重新组合在一起,大概是reversedSentence字符串:

    reversedSentence += str + " "; //you will have an extra space at the end
    

附注:

    对于较长的句子,
  • 使用StringBuilder可能比字符串连接更有效。
  • 您可以将所有字词放回循环中的List<String>并在循环后调用reversedSentence = String.join(" ", list)
  • 反转一个字符串可以在一行中完成 - 你应该在stackoverflow上找到许多相关的Q&amp; As。

答案 1 :(得分:4)

您可以使用StringBuilder

public static String spinWords(String sentence) {
    String[] splitWords = sentence.split(" ");
    StringBuilder builder = new StringBuilder();

    for (String str : splitWords) {
       if (str.length() < 5) {
           builder.append(str);
       else
           builder.append(new StringBuilder(str).reverse().toString());

       builder.append(" ");
    }

    return builder.toString().trim();
}

答案 2 :(得分:0)

不需要使用其他任何东西,只需检查你的&#34; for&#34;循环并记住添加未反转的字符串。

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;
}

答案 3 :(得分:0)

在处理StringBuilder中的元素时,使用splitWords来构建答案。

您可能还会发现space的成语具有特殊的首次值(&#34;&#34;)非常有用。

您的原始代码中也存在错误。

所以我会这样做:

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

答案 4 :(得分:-1)

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

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();
}