« Pythonで「成分解析」(ハッシュ値を乱数シードに使う) |Main| Jython入門 »

« | Java | Jython入門 »

Javaでタブ区切りのファイルを読み込む

Jythonで書いたものと比較するために、Javaでタブ区切りのファイルを読み込む関数を実装しました。なんだかやたらとまどろっこしい気がしますが、もっとスマートな書き方はないのでしょうか…。故意に悪い書き方はしていないつもりなのですが、これではJavaに不利すぎますね。

	public String[][] loadTSVData(String filename) {
		ArrayList aList = new ArrayList();
		String[][] result = null;
		try {
			FileReader fi = new FileReader(filename);
			BufferedReader br = new BufferedReader(fi);

			while (br.ready()) {
				String line = br.readLine();
				ArrayList lineList = new ArrayList();
				StringTokenizer st = new StringTokenizer(line, "\t");
				while (st.hasMoreTokens()) {
					lineList.add(st.nextToken());
				}
				aList.add(lineList);
			}

			br.close();
			fi.close();
			int size = aList.size();
			result = new String[size][];
			for(int i = 0; i < size; i++){
				ArrayList lineList = (ArrayList) aList.get(i);
				int lineSize = lineList.size();
				result[i] = new String[lineSize];
				for(int j = 0; j < lineSize; j++){
					result[i][j] = (String) lineList.get(j);
				}
			}
			                          
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}

同じ処理をJythonで書くとこうなります。

def loadTSVFile(filename):
    fi = open(filename)
    result = []
    for line in fi.readlines():
        items = line.strip().split("\t")
        result.append(items)
    return result

前者のコードはファイルからArrayListに読み込んだ後でString[][]に移し替えてから返していますが、後者はファイルからPyListに読み込んだ後、そのまま返しています。なので「同じ処理」は正確には前者のコードからファイルをクローズした後の10行を削ったものになります。

ただ、返り値は型がPyObjectですが、すでに型の定まっているJavaクラスのフィールドに代入したりメンバ関数へ引数として与えたりした場合は自動で変換されるので、うまく使えばそもそも変換する必要がないかも知れません。

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/20

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.