すべてのカテゴリ » インターネット・パソコン » 技術・プログラミング

質問

終了

和英辞書アプリケーションを作っています。
BufferedReaderで読み込んだtxtファイルをStringTokenizerで区切りたいのですが、使い方がよくわかりません。


現状は

try{BufferedReader japanesefile = new BufferedReader(new FileReader("word/01japanese.txt"));
while ((jp=japanesefile.readLine())!=null) {japWord[n1] = jp; n1++;}
japanesefile.close();}
catch(IOException ie){System.exit(1);}

上記のBufferedReaderで






といった日本語、英語別のtxtファイルを読み込んでます。


これを

赤,red
青,blue
緑,green

というBufferedReaderで読み込んだtxtファイルを

japWord[0] = "赤"
engWord[0] = "red"
japWord[1] = "青"


という風に分けたいのですが、どうすればよいでしょうか?
java習い始めで質問の仕方すらままならないですが、よろしくお願いします。

  • 質問者:TsT
  • 質問日時:2009-01-06 22:54:54
  • 0

StringTokenizerを使う場合は、こんな感じになります。
(Javaファイルの頭にimport java.util.StringTokenizer;を入れるのも忘れずに。)

StringTokenizer st = null;
boolean isFirstToken = true;

try {
 BufferedReader japanesefile
   = new BufferedReader(new FileReader("word/01japanese.txt"));
 while ((jp = japanesefile.readLine()) != null) {

  // カンマを区切り文字として、StringTokenizerを作成
  st = new StringTokenizer(jp, ",", false);
  // 次のトークンがある限りループ
  while (st.hasMoreTokens()) {
   String token = st.nextToken();
   // 1個目のトークン
   if (isFirstToken) {
    // 日本語の方に入れる
    japWord[n1] = token;
    isFirstToken = false;
   // 2個目以降のトークン
   } else {
    // 英語の方に入れる
    engWord[n1] = token;
   }
  }
  // フラグを元に戻す
  isFirstToken = true;

  n1++;
 }
 japanesefile.close();
} catch (IOException ie) {
 System.exit(1);
}


ただこの様な場合は、Stringのsplit()メソッドを使う方が一般的だろうと思います。
split()を使うと、こんな感じになります。

try {
 BufferedReader japanesefile
   = new BufferedReader(new FileReader("word/01japanese.txt"));
 while ((jp = japanesefile.readLine()) != null) {

  // jpを","で分割する
  String[] lineArray = jp.split(",");
  // 日本語の方をjapWordに入れる
  japWord[n1] = lineArray[0];
  // 英語の方をengWordに入れる
  engWord[n1] = lineArray[1];

  n1++;
 }
 japanesefile.close();
} catch (IOException ie) {
 System.exit(1);
}

StringTokenizerを使うよりコードが短いですよね。


とりあえず、StringTokenizerとStringのsplit()のJavadocを紹介しておきます。
細かな使い方は、Javadocを参考にしてください。
(Javadocは結構使える資料なので、読める様になると良いと思います。)
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util/StringTokenizer.html
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#split(java.lang.String)

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

ありがとうございます!split()は知りませんでした
参考になります

並び替え:

import java.io.*;
import java.util.*;
public class Test{

public static void main(String args[]){
try{
int n1 = 0;
ArrayList jplist = new ArrayList();
ArrayList enlist = new ArrayList();
BufferedReader japanesefile = new BufferedReader(new FileReader("test.txt"));
String jp = null;
while ((jp=japanesefile.readLine())!=null) {
StringTokenizer st = new StringTokenizer(jp,",");
while (st.hasMoreTokens()) {
jplist.add(st.nextToken());
enlist.add(st.nextToken());
}
}
System.out.println("jplist = "+jplist);
System.out.println("enlist = "+enlist);
japanesefile.close();}
catch(IOException ie){
System.exit(1);
}


}

}

以上です。javaでは配列の要素の数(赤、青なら2つですね)が決まっていない場合は配列ではなくて、java.util.Listを利用するのが一般的です。また、StringTokenizerはコンストラクタの第二引数を変えることでデリミタ(区切り文字)をカンマ以外にも変更することができます。不明点があれば補足してください。後、こういった簡単なファイル処理でしたら、pythonなどのスクリプト言語の方が簡単に書けます。興味ないかもしれませんが一例を挙げておきます。またJava、pythonともに私の環境(JDK5,python2.5)で動作を確認しております。 

#!/usr/bin/python

jplist = []
enlist = []
for str in open("test.txt","r"):
jp,en = str.split(",")
jplist.append(jp)
enlist.append(en)
print jplist
print enlist

===補足===
ちなみに、pythonではインデントが重要なので上記のコピペだと動作しません。
for str...の下3行をインデントする必要があります

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

ありがとうございます!
一応アプリケーションの一部なので、和英辞書部分もjavaを使ってます

関連する質問・相談

Sooda!からのお知らせ

一覧を見る