-2

我正在为外部排序编写一个合并排序,它一次从文件 A 中读取 2 块数据,将它们合并成一个更大的块,然后将其写入文件 B。之后,我需要读取其中增加的 2 个从文件 B 一次块,将它们合并为 1 个更大的块,并将其写入文件 A。这种切换一直持续到最后所有数据都计为 1 个块。

我尝试在每次迭代后像这样交换标识符:

RandomAccessFile temp = fileA;
    fileA = fileB;
    fileB = temp;

这要求我使用新的文件目录名称更新 BufferedInput 和 BufferedOutputStreams 并每次都构造它们。

我的 RAM 数量有限,因此除非必须,否则我无法继续创建新对象。每次迭代是否有更好的方法来切换目标文件和源文件?

4

1 回答 1

-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;
    }
}

创建两个RandomAccessFiles 并将它们安装在Swapable. 使用get方法获取当前文件。使用swap方法在它们之间切换。

于 2018-09-24T15:18:07.607 回答