用Java反转"Hello World"字符串的每个单词

Vic*_*nak 39 java string reverse

我要扭转各个人在Java中的String(不是整个字符串,只是每个人的字)的字.

示例:如果输入String为"Hello World",则输出应为"olleH dlroW".

Wil*_*del 106

这应该可以解决问题.这将迭代源字符串中的每个单词,使用StringBuilder内置reverse()方法反转它,并输出反转的单词.

String source = "Hello World";

for (String part : source.split(" ")) {
    System.out.print(new StringBuilder(part).reverse().toString());
    System.out.print(" ");
}
Run Code Online (Sandbox Code Playgroud)

输出:

olleH dlroW 
Run Code Online (Sandbox Code Playgroud)

注意:评论者已经正确地指出了我认为应该在这里提到的一些事情.此示例将在结果的末尾附加一个额外的空格.它还假设您的单词每个单独的空格分隔,并且您的句子不包含标点符号.

  • 这听起来像是一个家庭作业,使用内置方法是不可接受的. (4认同)
  • @fastcodejava - 在某些人的心目中,完整的家庭作业问题答案是不可接受的......因为'最终它对OP没有帮助. (3认同)
  • 可能,但我会在这里留下这个答案,因为这个问题没有说明是否与作业有关. (2认同)

JRL*_*JRL 47

了解你的图书馆;-)

import org.apache.commons.lang.StringUtils;

String reverseWords(String sentence) {
    return StringUtils.reverseDelimited(StringUtils.reverse(sentence), ' ');
}
Run Code Online (Sandbox Code Playgroud)


fas*_*ava 23

split进入单词后,您需要对每个单词执行此操作array.

public String reverse(String word) {
    char[] chs = word.toCharArray();

    int i=0, j=chs.length-1;
    while (i < j) {
        // swap chs[i] and chs[j]
        char t = chs[i];
        chs[i] = chs[j];
        chs[j] = t;
       i++; j--;
    }
    return String.valueOf(chs);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果文本中有代理对,则无效. (3认同)

pol*_*nts 17

这是最简单的解决方案,甚至不使用任何循环.

public class olleHdlroW {
    static String reverse(String in, String out) {
        return (in.isEmpty()) ? out :
            (in.charAt(0) == ' ')
            ? out + ' ' + reverse(in.substring(1), "")
            : reverse(in.substring(1), in.charAt(0) + out);
    }
    public static void main(String args[]) {
        System.out.println(reverse("Hello World", ""));
    }
}
Run Code Online (Sandbox Code Playgroud)

即使这是作业,也可以随意复制并作为自己的作品提交.您可以获得额外的功劳(如果您可以解释它是如何工作的)或因抄袭而被抓住(如果您不能).

  • 我想这个解决方案可以用于可能的lisp作业,只在java中实现:) (12认同)
  • 递归循环仍然是一个循环;) (4认同)
  • 提示:想想什么而不是如何. (3认同)
  • 你能详细解释一下吗?似乎很复杂. (2认同)
  • 如果字符串的最后一个字符是空格,则会抛出异常. (2认同)

Hea*_*ers 8

这里没有人考虑unicode角色.您需要使用java.text.BreakIterator查找单词边界,然后在每个单词边界内使用另一个单词边界来枚举字符边界:

String helloWorld = "He\u0308llo World"; // Hëllo World
StringBuilder reverseStringBuilder = new StringBuilder(helloWorld.length());
BreakIterator wordBreakIterator = BreakIterator.getWordInstance();
wordBreakIterator.setText(helloWorld);

int wordStart = wordIterator.first();
int wordEnd = wordIterator.next();

while (wordEnd != BreakIterator.DONE) {
    String word = helloWorld.substring(wordStart,wordEnd);
    if (Character.isLetterOrDigit(word.charAt(0))) {
        // "Hello" or "World" in our example
        BreakIterator characterBreakIterator = BreakIterator.getCharacterInstance();
        characterBreakIterator.setText(word);
        int characterEnd = characterBreakIterator.last();
        int characterStart = characterBreakIterator.previous();
        while (characterStart != BreakIterator.DONE) {
            reverseStringBuilder.append(word.substring(characterStart, characterEnd));

            characterEnd = characterStart;
            characterStart = characterBreakIterator.previous();
        }
    } else {
        // " " in our example
        reverseStringBuilder.append(word);
    }
    wordStart = wordEnd;
    wordEnd = wordIterator.next();
}

String dlroWolleh = reverseStringBuilder.toString(); // "dlroW ollëH"
Run Code Online (Sandbox Code Playgroud)

使用上面的天真方法会在你反转时将变音符号移到\u0308第一个上面.你希望它保持在上面.lStringe

  • 我使用了一个本机方法(利用StringBuilder和String.charAt()方法)来反转字符串'He\u0308llo World'.我的输出是'dlroWoll̈eH'.代码:private void reverseString(String input){try {StringBuilder build = new StringBuilder(); for(int i = input.length() - 1; i> = 0; i - ){build.append(input.charAt(i)); } logp.info("reversed:"+ build.toString()); } catch(Exception e){logp.error(e.getMessage(),e); }} (2认同)

Bar*_*acs 5

我是一个C/C++人,练习java面试让我知道是否可以改变或改进.以下允许多个空格和换行符.

第一个是使用StringBuilder

public static String reverse(String str_words){
    StringBuilder sb_result = new StringBuilder(str_words.length());
    StringBuilder sb_tmp = new StringBuilder();
    char c_tmp;
    for(int i = 0; i < str_words.length(); i++){
        c_tmp = str_words.charAt(i);    
        if(c_tmp == ' ' || c_tmp == '\n'){
            if(sb_tmp.length() != 0){   
                sb_tmp.reverse();
                sb_result.append(sb_tmp);
                sb_tmp.setLength(0);
            }   
            sb_result.append(c_tmp);
        }else{
            sb_tmp.append(c_tmp);
        }
    } 
    if(sb_tmp.length() != 0){
        sb_tmp.reverse();
        sb_result.append(sb_tmp);
    }
    return sb_result.toString();
}
Run Code Online (Sandbox Code Playgroud)

这个是使用char [].我觉得它效率更高......

public static String reverse(String str_words){
    char[] c_array = str_words.toCharArray();
    int pos_start = 0;
    int pos_end;
    char c, c_tmp; 
    int i, j, rev_length;
    for(i = 0; i < c_array.length; i++){
        c = c_array[i];
        if( c == ' ' || c == '\n'){
            if(pos_start != i){ 
                pos_end = i-1;
                rev_length = (i-pos_start)/2;
                for(j = 0; j < rev_length; j++){
                    c_tmp = c_array[pos_start+j];
                    c_array[pos_start+j] = c_array[pos_end-j];
                    c_array[pos_end-j] = c_tmp;
                }
            }
            pos_start = i+1;
        }
    }
    //redundant, if only java had '\0' @ end of string
    if(pos_start != i){
        pos_end = i-1;
        rev_length = (i-pos_start)/2;
        for(j = 0; j < rev_length; j++){
            c_tmp = c_array[pos_start+j];
            c_array[pos_start+j] = c_array[pos_end-j];
            c_array[pos_end-j] = c_tmp;
        }
    }   
    return new String(c_array);
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,你是一个C++人. (25认同)