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クラスのフィールドに代入したりメンバ関数へ引数として与えたりした場合は自動で変換されるので、うまく使えばそもそも変換する必要がないかも知れません。