翻译句子中的单词

时间:2016-05-10 21:13:16

标签: java

我正试图扭转字符串中的单词。如果输入是

The quick brown fox

预期的输出是,

fox brown quick The

我正在遵循一个简单的算法,将整个句子翻转,然后将这些单词反转回来。 这是我的代码。

public static void reverseWords(char[] s) {
            reverse(s);
            int start = 0;
            for (int i = 0; i < s.length ; i++) {

                if(s[i] == ' '){
                    indexedReverse(s, start, i);
                    start = i+1;
                }
            }

        }

        private static void reverse(char[] s){
            int len = s.length;
            for(int i=0; i< len/2 ; i++){
                char temp = s[i];
                s[i] = s[len -1 -i];
                s[len - 1- i] = temp;
            }
        }

        private static void indexedReverse(char[] s, int start, int end){

            for (int j = start; j <end/2; j++){
                char temp = s[j];
                s[j] = s[end - 1 - j];
                s[end -1 -j] = temp;
            }
        }

        public static void main(String[] args) {

            String str = "The quick brown fox";
            char[] s = str.toCharArray();
            reverseWords(s);
            String newStr = new String(s);
            System.out.println(newStr);
        }

问题是indexedReversed()函数只对第一个单词进入for循环一次,然后它完全跳过循环。我在这做错了什么。 我得到的输出是,

fox nworb kciuq ehT

5 个答案:

答案 0 :(得分:4)

这里有一行可以完成所有工作:

String reversed = Arrays.stream(str.split(" ")).reduce((a, b) -> b + " " + a).get();

打破这个局面:

  • str.split(" ")创建一个单词数组,放弃它们之间的空格
  • Arrays.stream()汇集了
  • 字样
  • reduce()可让您将所有流元素合并为一个值。 lambda (a, b) -> b + " " + a通过将 next 值添加到最终值的 start 来组合元素
  • get()被调用是因为reduce()返回Optional来处理流中没有任何内容的情况,但我们知道因为split()始终返回至少一个元素

老实说,有时修复代码的方法是替换它,简单就是最好。

答案 1 :(得分:4)

您的indexedReverse方法似乎没有考虑到单词开头的相对位置。

public static void reverseWords(char[] s) {
        reverse(s);
        int start = 0;
        for (int i = 0; i < s.length ; i++) {

            if(s[i] == ' '){
                indexedReverse(s, start, i);
                start = i+1;
            }
        }

    }

    private static void reverse(char[] s){
        int len = s.length;
        for(int i=0; i< len/2 ; i++){
            char temp = s[i];
            s[i] = s[len -1 -i];
            s[len - 1- i] = temp;
        }
    }

    private static void indexedReverse(char[] s, int start, int end){
        int newEnd = start+(end-start)/2; // it worked for the first word because start = 0
        for (int j = start; j <newEnd; j++){
            char temp = s[j];
            s[j] = s[end - 1 - j];
            s[end -1 -j] = temp;
        }
    }

    public static void main(String[] args) {

        String str = "The quick brown fox";
        char[] s = str.toCharArray();
        reverseWords(s);
        String newStr = new String(s);
        System.out.println(newStr);
    }
}

答案 2 :(得分:1)

对于它的价值,这里是Java 7的替代解决方案,我认为更容易理解:

public static void main(String[] args) throws ParseException {
    String quickBrownFox = "the quick brown fox";

    String[] sentenceWords = quickBrownFox.split(" ");

    StringBuffer reverse = new StringBuffer();

    for(int i = sentenceWords.length - 1; i >= 0; i--){
        reverse.append(sentenceWords[i] + " ");
    };

    System.out.println(reverse.toString());
}

此代码以相反的顺序循环遍历原始String,并将每个单词追加到新的StringBuffer

<强>输出:

  

狐狸棕快速

答案 3 :(得分:0)

public static void reverseWords(char[] s) {
        reverse(s);
        int start = 0;
        for (int i = 0; i < s.length ; i++) {

            if(s[i] == ' '||s.length-1==i){
    if(s.length-1==i)
        i++;    
    indexedReverse(s, start, i);
            start = i+1;
            }
        }

    }

    private static void reverse(char[] s){
        int len = s.length;
        for(int i=0; i< len/2 ; i++){
            char temp = s[i];
            s[i] = s[len -1 -i];
            s[len - 1- i] = temp;
        }
    }

    private static void indexedReverse(char[] s, int start, int end){
        for (int j = start; j <(start+end)/2; j++){

    char temp = s[j];
            s[j] = s[end -1 -(j-start)];
            s[end -1 -(j-start)] = temp;
        }
    }

    public static void main(String[] args) {

        String str = "The quick brown fox";
        char[] s = str.toCharArray();
        reverseWords(s);
        String newStr = new String(s);
        System.out.println(newStr);
    }

答案 4 :(得分:0)

试试这个,

 public static final String reverseString(String x){
        return x.split("\\s+").reverse().join(' ');
    }

可以使用

调用
System.out.println(reverseString(line));