gpt4 book ai didi

java - 如何将单个文件合并为一个已排序的文件?

转载 作者:行者123 更新时间:2023-12-04 04:54:02 25 4
gpt4 key购买 nike

我在我的工作区中保存了 4 个文件 a、b、c、d 中的一堆 ID。我想将所有这些 id 以排序的顺序合并到一个文件 merge.txt .. 它们将每行保存为一个字符串。我可以通过将文件放入内存来单独对文件进行排序。但是我如何合并它们,可能会有重复的条目。我想不出如何比较四个文件中的每个条目(它们可以增长到 8 个,因此不能对此进行硬编码)。特别是如何比较条目以及如何仅推进那些是最小条目的文件指针?

public void sortFile() throws IOException
{
File a = new File("/Users/phoenix/workspace/data/a.txt");
File b = new File("/Users/phoenix/workspace/data/b.txt");
File c = new File("/Users/phoenix/workspace/data/c.txt");
File d = new File("/Users/phoenix/workspace/data/d.txt");

doSort(a);
doSort(b);
doSort(c);
doSort(d);

merge();
}

如何根据下面的伪代码修改合并方法?
public void merge()
{
File dir = new File("/Users/phoenix/workspace/data");

for(File f: dir.listFiles())
{
// toDo: merge into a single file merged.txt
}
}

public void doSort(File f) throws IOException
{
BufferedReader reader = new BufferedReader(new FileReader(f));
String line;
ArrayList<String> list = new ArrayList<String>();
while((line = reader.readLine())!=null)
{
list.add(line);
}

Collections.sort(list);

PrintWriter out = new PrintWriter(f);

for(String s:list)
out.println(s);

reader.close();
out.close();
}


public void merge() throws IOException
{
File dir = new File("/Users/phoenix/workspace/data");
File merged = new File("/Users/phoenix/workspace/data/merged.txt");

ArrayList<BufferedReader> readers = new ArrayList<BufferedReader>(dir.listFiles().length);
ArrayList<String> list = new ArrayList<String>();
PrintWriter out = new PrintWriter(merged);

for(File f: dir.listFiles())
{
readers.add(new BufferedReader(new FileReader(f)));
}

while(true)
{
for (BufferedReader reader: readers)
{
if(reader.readLine()!=null)
list.add(reader.readLine());

else
{
reader.close();
}

}

String min = Collections.min(list);
int index = list.indexOf(min);
out.write(min);
}



}

最佳答案

下面是算法的一般描述:

  • 打开每个文件,并阅读它的第一项。
  • 遍历所有文件,选择当前项最小的一个文件;如果多个文件具有相同的项目,则选择具有该项目的第一个文件
  • 从您在步骤 2 中确定的文件中删除最小的项目,并将其写入输出文件
  • 如果从中删除项目的文件已结束,请关闭该文件,并将其从文件列表中删除
  • 如果文件列表不为空,请返回到步骤 2。

  • 在执行算法之前,您的代码需要检查是否存在至少一个输入文件;否则,您的代码应该退出。

    编辑:您的 merge代码看起来不像上面的算法;这里有一些代码可以帮助您入门:
    // Prepare your readers and their top items
    for(File f: dir.listFiles()) {
    BufferedReader br = new BufferedReader(new FileReader(f));
    String firstLine = reader.readLine();
    // Your code inserts buffered readers unconditionally;
    // You should not insert readers for empty files.
    if (firstLine != null) {
    readers.add(br);
    list.add(firstLine);
    } else {
    br.close();
    }
    }
    // Stop when the last reader is removed
    while (!readers.isEmpty()) {
    int minIndex = ... // Find the index of the smallest item in the "list"
    out.write(list.get(minIndex));
    BufferedReader br = readers.get(minIndex);
    String next = br.readLine();
    if (next != null) {
    list.set(minIndex, next);
    } else {
    br.close();
    list.remove(minIndex);
    readers.remove(minIndex);
    }
    }

    关于java - 如何将单个文件合并为一个已排序的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17035657/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com