1

Java プログラムに空白行のテキストを入力として受け入れさせ、それらを最終出力に表示させようとしています。

基本的に、私は単語スクランブリング プログラムを作成しました。これは、スキャナーから不特定の量のテキストを取り込み、各単語の最初と最後の文字を除いて、各単語を個別にスクランブルすることになっています。スクランブリングと解析が正常に機能するようになったので、心配する必要はありません。私が取り組んでいる最後の仕様は、ユーザーがテキストの空白行に入力する「戻る」ボタンを押す可能性があるという事実です。

たとえば、誰かが「ピザは私のお気に入りの食べ物です」と入力するとします。

出力は次のようになります: Pziza is my fovaitre tnhig to eat

これは 1 行で完全に機能しますが、誰かが次のように入力した場合:

お気に入り

動物

最後の行のみが印刷され、スクランブルされます: aimnlas

調査で見つけたいくつかの異なる提案を試しましたが、ほとんどはファイルの読み取りやその他の提案であり、うまくいきませんでした。これは私が今していることです:...

Scanner input = new Scanner(System.in);
    String text = "";
    System.out.println("Enter text to scramble: ");
    while(input.hasNextLine()){
        text = input.next();
    }
    System.out.println(scramble(text));

どんな助けでも大歓迎です。みんなありがとう=)

編集: OK、スクランブル メソッドで行ったことが、空白行の許可を妨げている可能性があると考えています。私はそれを調べましたが、それを特定できないようですので、誰かが見て、あなたの考えを教えていただければ幸いです=)

private static String scramble(String txt) {
    StringTokenizer st = new StringTokenizer(txt, " ,.!?()-+/*=%@#$&:;\"'", true);
    String[] tokens = new String[st.countTokens()];
    String scrambled = "";
    int letter = 0;
    int wordlength = 0;
    char[] temp;

    while(st.hasMoreTokens()) {
        tokens[letter] = st.nextToken();
        letter++;
    }

    for(int i = 0; i < tokens.length; i++) {
        if(tokens[i].length() <= 3) {
            scrambled += tokens[i];
            continue;
        }   
        wordlength = tokens[i].length() - 1;
        temp = new char[wordlength + 1];
        temp[0] = tokens[i].charAt(0);
        temp[wordlength] = tokens[i].charAt(wordlength);
        ArrayList<Character> c = new ArrayList<Character>();
        for(int j = 1; j < wordlength; j++) {
          c.add(tokens[i].charAt(j));
        }
        Collections.shuffle(c);
        String z = new String();
        for(Character x:c){
          z += x.toString();
        }
        String output = new String(temp[0] + z + temp[wordlength]);
        scrambled += output;
    }
    return scrambled;
}
4

1 に答える 1

0

から読み取る場合System.in、デフォルトではキーボードから読み取ります。これは無制限の入力ストリームであるため、Scanner.hasNextLine()常に true を返します。

1 つの解決策は、一度に 1 行ずつ読み取り、次のように各行を単語に分割することString.split()です。

Scanner input = new Scanner(System.in);
String text = "";
System.out.println("Enter text to scramble: ");
boolean done = false;
while (!done) {
   text = input.nextLine();

   if (text.equals("")) {
      done = true;
   } else {
      performScramble(text);
   }
}
...

void performScramble(String line) {
    String[] words = line.split("\\s+");
    for (String word: words) {
        System.out.println(scramble(word));
    }    
}
于 2012-09-20T23:42:24.163 に答える