2016-05-10 5 views
-1

私は文字列中の単語を逆にしようとしています。入力が予想される出力がある文の中の単語を逆にする

The quick brown fox 

fox brown quick The 

私はシンプルalgortihmを以下のよである場合、これは、文全体を逆にして、バックの言葉を逆に。 これは私のコードです。

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 
+1

あなたは、 "正規表現の周りに文字列を分割" してからちょうどを逆方向に反復していないのはなぜその配列? –

+0

それもできますが、なぜ私のロジックが働いていないのか理解したい。 – Clockwork

+0

@ DarkV1あなたが何を意味しているのか正確には分かりません。 – Clockwork

答えて

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); 
    } 
} 
+0

明確にするために違いを指摘したりコメントしたりできますか? –

+0

ええ私はその理由のために投稿した直後に簡単に編集しました:p – kpie

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に追加されます。

出力:速い茶色

キツネ

+0

私は似たような解決策を書くことを考えていたが、今は彼のコードがうまくいかない理由が本当に不思議だ。 – kpie

+0

私は本当に別の解決策を探していない。私は1時間のために自分のコードをデバッグして、ちょうどそれが動作していない理由を理解できません。 – Clockwork

+2

@Clockwork十分な公正ですが、私は後世の答えを残します –

4

ここではすべてのそれをしない1行です:

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

これを破壊:

    は、
  • str.split(" ")はそれら
  • Arrays.stream()
  • reduce()を使用すると、1つの値にすべてのストリーム要素を組み合わせることができます単語をスペースをストリーム破棄、単語の配列を作成します。ラムダ(a, b) -> b + " " + areduce()ストリームで何もない場合を処理するためにOptionalを返すために呼び出され
  • get()最終値の開始値を追加することにより、要素を組み合わせたが、私たちはそこにある知っていますsplit()は常に少なくとも1つの要素を返します

正直なところ、コードを修正する方法はそれを置き換えることであり、シンプルな方法が最適です。

+0

もう一度別の解決策を探しているわけではありません。しかし、これはかなりエレガントです。 – Clockwork

+0

ちょうど好奇心から、コードを少し説明できますか。私はまだJava 8の表面を傷つけただけです。 – Clockwork

+0

@Clockworkでも、あなたのコードは本当に恐ろしく、率直に言ってデバッグや保存に値するものではありません。あなたがやっていることや、やろうとしていることを理解するコードがあまりにも多くあります。言語をエレガントに使うことは、言語を学ぶことの一部です。 – Bohemian

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

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

を使用して呼び出すことができ、これを試してみてください、

System.out.println(reverseString(line)); 
+0

これは動作しません。 – Clockwork

関連する問題