• ベストアンサー

行ごとに文を単語単位で逆順に出力するプログラム

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 のように出力されてしまいます。 どこがおかしいのでしょうか?どなたか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.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); }

tksmsysh
質問者

お礼

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

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

tokenList の中身をクリアする処理がループの中で行われていません。従って、前に逆転させた行がtokenList の中に残っていて、次の逆転させた文字列の表示処理で前のものが表示されてしまいます。  while ((line = in.readLine()) != null) { の直後に   tokenList.clear(); を挿入すればあなたが考えたとおりの動きになると思います。

tksmsysh
質問者

お礼

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