電子書籍の厳選無料作品が豊富!

input.txtを読み込み、各行を単語単位で逆順にしてoutput.txtに出力するプログラムを考えています。
例えば、input.txtの内容が

Hello World.
I study java.
Please help me.

である場合、output.txtの内容は

.World Hello
.java study I
.me help Please

となります。

この問題に対し、私は http://shorttext.com/pg8p6enbnd にあるようなプログラムを考えました。
しかし、実際に実行してみると、上の例でいうなら

World. Hello
java. study I
World. Hello
me. help Please
java. study I
World. Hello

のように出力されてしまいます。
どこがおかしいのでしょうか?どなたか教えてください。

A 回答 (2件)

問題点は2つ。



1番目は、No1さんの指摘の通り。tokenList がどんどん長くなっていくので、
A B C
D E
の入力だと1行目の処理では、tokenList=["A","B","C"]で、出力が "C B A"になりますが、2行目の処理では出力を"E D“にしたいのに、tokenList=["A","B","C","D","E"]になり、出力が"E D C B A"になってしまいます。行ごとにclearが必要。

2番目は、StringTokenizer は区切り文字を与えないと、空白文字で語を区切るので、ピリオドは語の一部になります。

変更を最小限にするとループの中はこんな感じで。

StringTokenizer st = new StringTokenizer(line," .",true);

tokenList.clear();
while (st.hasMoreTokens()) {
String token = st.nextToken();
tokenList.add(token);
}

String reverse = "";
for (int i = 0; i < tokenList.size(); i++) {
reverse = reverse + tokenList.get(tokenList.size()-i-1);
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
StringTokenizerのコンストラクタの第2引数で区切り文字を決められるんですね。しかも複数与えられるようなので勉強になりました!
今回は2つの問題点に言及して下さり、具体的なプログラムを示してくださったnotnotさんにベストアンサーを贈らせていただきたいと思います。

お礼日時:2011/06/11 13:15

tokenList の中身をクリアする処理がループの中で行われていません。

従って、前に逆転させた行がtokenList の中に残っていて、次の逆転させた文字列の表示処理で前のものが表示されてしまいます。

 while ((line = in.readLine()) != null) {
の直後に
  tokenList.clear();
を挿入すればあなたが考えたとおりの動きになると思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
なるほど、確かにtokenListには単語が蓄積されていくばかりですね(^_^;)
tokenList.clear()便利ですね!

お礼日時:2011/06/11 13:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!