【问题标题】:Merge sorting multiple files which have variable word counts合并排序具有可变字数的多个文件
【发布时间】:2013-03-06 00:08:10
【问题描述】:

我将一个 10 GB 的文件拆分为多个 100000 + 几百个单词的文件(因为当我遇到 100000 个单词时我读到了一行)。

private void splitInputFile(String path) {
    try{
        File file=new File(path);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String temp;
        temp = br.readLine();
        String fileName="fileName";
        int fileCount = 1;
        while(temp!=null){
                //TODO Read 100000 words, sort and write to a file. Repeat for the entire file
            if(wordsToBeSorted.size()<=100000){
                startCounting(temp);
                temp=br.readLine();
            }//end of if ->  place 100000+ words inside the list
            else{
                Collections.sort(wordsToBeSorted);
                fileName = "fileName"+fileCount;
                fileCount++;
                File splitFile = new File(fileName);
                PrintWriter pr = new PrintWriter(splitFile);
                for(String word:wordsToBeSorted){   
                    pr.write(word);
                    pr.write("\n");//check if this works -> 1 word per line
                }//end of for
            }//end of else              
        }//end of while
        mergeSort(fileCount);
    }//end of try
    catch(Exception e){
        e.printStackTrace();
    }
}


private void startCounting(String sb) {
    StringTokenizer tokenizer = new StringTokenizer(sb);// Split by space
    while (tokenizer.hasMoreTokens()) {
        String text = tokenizer.nextToken();
        text = text.replaceAll("\\W", "");// Remove all symbols
        if("".equals(text.trim()))
            continue;
        wordsToBeSorted.add(text);
    }

}

现在我想知道如何对这些文件进行排序。我发现我应该做一个合并排序。考虑到每个 splitFile 的字数可变(100000 + 几个额外的字)的事实,是否可以进行涉及可变字数文件的合并排序?还是我应该按照其他方法来拆分文件?

【问题讨论】:

    标签: java file sorting merge


    【解决方案1】:

    是否可以对包含可变字数的文件进行合并排序?

    当然。我假设这里的目标是external sorting。只需打开所有输入文件(除非有真的很多,在这种情况下您可能需要多次运行),从每个文件中读取第一个单词。然后用最小的单词识别输入,将其放入输出并从该输入中读取下一个单词。关闭并删除所有变为空的输入,除非您没有更多输入。

    如果您有很多输入,您可以使用heap 来组织您的输入,将下一个单词作为键。您将删除最小对象,然后在继续下一个单词后重新插入它。

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2010-12-13
      相关资源
      最近更新 更多