2017-05-02 10 views
0

逆の方法は、一連の単語を一度に入力すると機能しますか?Stackを使用して文中の単語を逆転させる

私の仕事は、ユーザーから一連の文字列を読み取る完全なメソッドを作成することでした。ユーザは単語の入力を停止するために「終了」を入力する。次に、入力された方法と逆の順序でストリングを出力します。文字列 "end"を出力しないでください。
スタックを使用してこのタスクを実行します。スタックオブジェクトに対してpush、pop、peek、isEmptyの各メソッドのみを呼び出します。

Enter a word or 'end' to quit: Hello 
Enter a word or 'end' to quit: Java 
Enter a word or 'end' to quit: World 
Enter a word or 'end' to quit: end 
You entered (in reverse): 
World 
Java 
Hello 

しかし、鉱山は実行されます:ここで

は、実行するようになっている方法です。ここ

Enter a word or 'end' to quit: Hello 
Enter a word or 'end' to quit: Java 
Enter a word or 'end' to quit: World 
Enter a word or 'end' to quit: end 
You entered (in reverse): end 

は、私がこれまで持っているものです。

import java.util.Scanner; 
import java.util.Stack; 
import java.util.regex.Pattern; 

public class Stack1 { 

public static void main(String[] args) { 
    Scanner scanner = new Scanner(System.in); 

    String input = "end"; 
    do { 
    System.out.printf("Enter a word or 'end' to quit: "); 
    input = scanner.nextLine(); 

    if (input == null || input.length() == 0) { 
     System.out.println("Invalid! Try again..."); 
     return; 
    } 
    } while(!input.equalsIgnoreCase("end")); 
    String reverse = reverse(input); 
    System.out.printf("You entered (in reverse): %s", reverse); 
} 

private static String reverse(String inputString) { 
    String[] str = inputString.trim().split(Pattern.quote(" ")); 
    Stack stack = new Stack(); 

    for(String input : str) { 
     stack.push(input); 
    } 

    StringBuilder builder = new StringBuilder(); 
    while(!stack.isEmpty()) { 
     builder.append(stack.pop()).append(" "); 
    } 
    return builder.toString(); 
} 

} 
+0

あなたがdo-while文の各繰り返しで、あなたの 'input'変数を上書きしているようです。ループ内で文字列を連結することはお勧めしませんが、_reverse_メソッドを呼び出すときに 'StringBuilder'を使用して' String'に変換することはお勧めしませんが、既に入力された 'String'値のレコードを保持する必要があります。 –

+0

誰もOPが文字列を連結することを提案しているのはなぜですか?それは間違いです。入力された各単語はループ内のスタックに追加する必要があります。 – tima

+1

@ティムラ。元の質問には、単語がスペースで区切られた単一の文字列を必要とする 'reverse()'の実装が含まれていたためです。なぜOPが自分のポストを荒らしたのか分かりません。 – shmosel

答えて

0

あなたのループが上書きされます各反復でinputそれはあなたのreverse()方法で動作させるために、あなたがスペースでインクリメンタルに各単語をCONCATしたいと思う:また

String input = ""; 
while (true) { 
    System.out.printf("Enter a word or 'end' to quit: "); 
    String next = scanner.nextLine(); 

    if (next == null || next.length() == 0) { 
     System.out.println("Invalid! Try again..."); 
     return; 
    } 

    if (next.equalsIgnoreCase("end")) { 
     break; 
    } 

    input += next + " "; 
} 

、あなたはループで直接スタックを移入し、文字列の分割をスキップすることができます。

public static void main(String[] args) { 
    Scanner scanner = new Scanner(System.in); 
    Stack<String> stack = new Stack<>(); 

    while (true) { 
     System.out.printf("Enter a word or 'end' to quit: "); 
     String next = scanner.nextLine(); 

     if (next == null || next.length() == 0) { 
      System.out.println("Invalid! Try again..."); 
      return; 
     } 

     if (next.equalsIgnoreCase("end")) { 
      break; 
     } 

     stack.push(next); 
    } 

    System.out.println("You entered (in reverse):"); 

    while (!stack.isEmpty()) { 
     System.out.println(stack.pop()); 
    } 
} 

後者の解決法はマルチワード入力を正しく逆転させるが、連結アプローチでは行と語を区別できないことに注意してください。

+0

この場合、あなたの出力はちょうど1行にあります.3行ではありません – wylasr

+0

@wylasr OPの 'reverse()'実装の(簡単に修正された)専門用語です。私はそれが住む価値があるとは思わなかった。私の2番目の解決策は正しく印刷されます。 – shmosel

0

String reverse = reverse(input);//input="end" 問題は、この場所からあなたのアドバイスのための

@Tobyスパイツのおかげで来ます。

私は英語の新人ですが、私は何か提案を受け入れることを嬉しく思います。 私が言っていることは、問題を遭遇したときにあなたのプログラムをデバッグすることです。この場合:あなたは逆の文字列をコンソールに出力したいのですが、奇妙なanswer.nowを持っています多分から来る? その後、ちょうどあなたが今

String reverse = reverse(input);//we said you think the problem comes from this place. 
System.out.printf("%s%n",input);//this is a key statement to debug--just print it 

以下のようにそれを使用する前にそれを印刷し、その後inputはあなたが望むものではありませんどこを検討? inputがどこから来るのかを考えてみてください。これを続けてください。そして、あなたの問題がどこから来ているのかを見つけることができます。

一方、デバッグする方法がたくさんあります。あなたのプログラムをIDEでデバッグすることができ、より効率的になります。さらにログファイルを使用できるようになります。

+0

これは問題を解決するための貴重なヒントになるかもしれませんが、良い答えが解決策を示しています。あなたが意味することを示すサンプルコードを提供するために[編集]してください。代わりに、これをコメントとして書くことを検討してください。 –

-1

あなたはdo-whileループを使用しています。そのため、配列に「end」が追加されています。文字列を逆にする

、あなたはforループを使用することができますどちらかとそれを自分でリバース:

StringBuilder reverseStr = new StringBuilder(); 
for (int i = str.size - 1; i >= 0; i--) { 
    reverseStr.append(str[i]); 
} 

またはApache CommonsのラングStringUtils.reverse()のようなものを使用します。

+0

OPは文字列を反転させたくありません。 – shmosel

0

これは、入力変数に「end」のみが含まれているためです。したがって、逆関数を呼び出すたびに、終了文字列のみを反転させます。

1
  1. 読み込み入力。
  2. スタックに押し込みます。
  3. 入力が "end"の場合、入力の読み取りを停止します。
  4. スタックが空になるまでスタックします。

    コード

    import java.util.Scanner; 
    import java.util.Stack; 
    
        public class Stack1 { 
    
        public static void main(String[] args) { 
         Scanner in = new Scanner(System.in); 
    
         String input = ""; 
         Stack stack = new Stack(); 
         while(true){ 
          System.out.printf("Enter a word or 'end' to quit: "); 
          input = in.next(); // to read a word use next() method. 
          if(input.equalsIgnoreCase("end")){ break; } 
          if(!input.equals("")) stack.push(input); 
         } 
         System.out.println("You entered (in reverse): "); 
         while(!stack.isEmpty()) 
          System.out.println(stack.pop()); 
        } 
        } 
    
関連する問題