各CSVファイルに1つのリーダ/入力ストリームの配列(または必要に応じてコレクション)を作成します。
@JustinKSUアイデアと同様に、キーがCSVファイルの1行であるTreeMapを作成します。カスタムComparator、long、Dateなどで並べ替えるカスタムimplを渡します。値は、配列/ Collection内のファイルのインデックス(おそらくInteger、コレクションがMapの場合はファイル名になります)です。
各ファイルから最初の行を読み取って、ツリーマップをシードします。
TreeMap.pollFirstEntry()を使用して一番下の行を削除し、キー(行)をWriter/OutputStreamに書き込みます。値を使用して、適切なファイルからもう1行を読み込み(EOFをチェック)、それをツリーマップに追加します。
TreeMapが空になるまで繰り返します。すべてを閉じます。編集
- 追加されたソースコード
ノート、これだけ作品以下の入力ファイルがすでにをソートされている場合は! (質問に指定されたとおり)
public void mergeSort(File[] inFiles, File outFile, Comparator<String> comparator) throws IOException {
try {
BufferedReader[] readers = new BufferedReader[inFiles.length];
PrintWriter writer = new PrintWriter(outFile);
TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>(
comparator);
// read first line of each file. We don't check for EOF here, probably should
for (int i = 0; i < inFiles.length; i++) {
readers[i] = new BufferedReader(new FileReader(inFiles[i]));
String line = readers[i].readLine();
treeMap.put(line, Integer.valueOf(i));
}
while (!treeMap.isEmpty()) {
Map.Entry<String, Integer> nextToGo = treeMap.pollFirstEntry();
int fileIndex = nextToGo.getValue().intValue();
writer.println(nextToGo.getKey());
String line = readers[fileIndex].readLine();
if (line != null)
treeMap.put(line, Integer.valueOf(fileIndex));
}
}
finally {
// close everything here...
}
}
各csvで同じ形式ですか?そして、あなたは一貫性を保つために各レコードを必要としますか、 'Name'カラムを' City'カラムとは別にソートする必要がありますか? – Sheriff
はい各CSVの同じ形式。2番目の列に同じ値を持つ場合は最初の列を比較し、2番目の列に移動した場合は3番目の列に移動します。 列のペアを比較するたびに – omrid