我正在为外部排序编写一个合并排序,该排序一次从文件A读取2个数据块,将它们合并成更大的块,然后将其写入文件B。此后,我需要再读取2从文件B一次将这些增加的块中的1个块合并,将它们合并为1个更大的块,然后将其写入文件A。此切换一直进行到所有数据最后都计为1个块为止。
我尝试在每次迭代后像这样交换标识符:
RandomAccessFile temp = fileA;
fileA = fileB;
fileB = temp;
这要求我用新的文件目录名更新BufferedInput和BufferedOutputStreams并每次构造它们。
我的RAM数量有限,因此除非必要,否则我将无法继续创建新对象。有没有更好的方法可以在每次迭代时切换目标文件和源文件?
答案 0 :(得分:-1)
一个简单的通用Swapable
类应允许您在两个对象之间交换。
class Swapable<T> {
final T a;
final T b;
boolean useA = true;
Swapable(T a, T b) {
this.a = a;
this.b = b;
}
T get() {
return useA ? a : b;
}
void swap() {
useA = !useA;
}
}
创建两个RandomAccessFile
,然后将它们安装在Swapable
中。使用get
方法获取当前文件。使用swap
方法在它们之间切换。