3

如果有人可以帮助我,我真的很感激。我正在尝试进行外部排序,但我陷入了合并的困境。我知道我应该如何合并它只是不确定要使用什么功能。

现在,我正在尝试读取多个小文本文件的第一个单词,并将它们存储在文件数量大小的字符串数组中。所以基本上我会有一个每个文件的第一个单词的字符串数组。然后我确定哪个是最小的字母顺序并将其写入一个新文件,之后我将读取该最小单词的文件的下一个单词。该单词将放置在字符串数组中输出的最小单词的位置,并将其与其他文件中第一个单词的其余部分进行比较。这将不断重复,直到所有单词都被排序。

我遇到的主要问题是我正在使用扫描仪,并且在第一次比较它之后无法将最小的单词与文件中的下一个单词切换,因为扫描仪不会保留它所读取的内容。我知道 readline 可以,但由于我的文件都是由空格分隔的所有单词,所以我不能使用 readline。有人可以指导我使用无法帮助我解决此问题的足够阅读功能。

  for (int i = 0; i<B;i++)
  {
  try
  {
    BufferedReader ins = new BufferedReader(new FileReader(Run-"+ i + ".txt"));
    Scanner scanner2 = new Scanner(ins);
    temp3[i] = scanner2.next();

                System.out.println(temp3[i]);
            }
            catch(IOException e)
            {   
            }
        }
        for(int i=0;i<N;i++)
        {
            String smallest = temp3[0];
            int smallestfile = 0;
            for(j=0;j<B;j++)
            {
                int comparisonResult = smallest.compareTo(temp3[j]);
                if(comparisonResult>0)
                {
                smallest = temp3[j];
                smallestfile = j;
                }
            }
            BufferedReader ins = new BufferedReader(new FileReader("C:/Run-"+ smallestfile + ".txt"));
            Scanner scanner2 = new Scanner(ins);
            if(scanner2.hasNext())
            {
                temp3[smallestfile]=scanner2.next();
            }
        }
}
catch(Exception e)
{
}
4

3 回答 3

1

如果文件足够小,则将整个文件读取到内存中,然后使用String.split()将数组中的字符串分开并施展你的魔法。

如果文件更大,请保持打开并读取每个字节,直到找到并留出空间,然后对所有文件执行此操作,比较字符串,施展你的魔力并重复直到所有文件到达末尾。

编辑 :

字符串行 = readeOneLineFromTheCurrentFile(); String[] words = line.split(" ");

于 2013-03-13T04:12:24.767 回答
0

至于临时排序/存储单词,请使用 a PriorityQueue (不是数组)。抱歉,我忙于看棒球,无法添加更多内容。

于 2013-03-13T04:10:40.540 回答
0

我不确定,如果我理解正确,但 aScanner确实将位置保留在文件中。您需要的文件数量与文件数量一样多

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class so {
    // returns the index of the smallest word
    // returns -1 if there are no more words
    private static int smallest(String[] words) {
        int min = -1;
        for (int i = 0; i < words.length; ++i)
            if (words[i] != null) {
                if (min == -1 || words[i].compareTo(words[min]) < 0)
                    min = i;
            }

        return min;
    }

    public static void main(String[] args) throws FileNotFoundException {
        // open all files
        Scanner[] files = new Scanner[args.length];
        for (int i = 0; i < args.length; ++i) {
            File f = new File(args[i]);
            files[i] = new Scanner(f);
        }

        // initialize first words
        String[] first = new String[args.length];
        for (int i = 0; i < args.length; ++i)
            first[i] = files[i].next();

        // compare words and read following words from scanners
        int min = smallest(first);
        while (min >= 0) {
            System.out.println(first[min]);
            if (files[min].hasNext()) {
                first[min] = files[min].next();
            } else {
                first[min] = null;
                files[min].close();
                files[min] = null;
            }

            min = smallest(first);
        }
    }
}

经测试

a.txt: a d g j
b.txt: b e h k m
c.txt:c f i

更新

在您的示例中,您在外部 for 循环内打开和关闭文件。当您下次重新打开文件时,它当然会从文件的开头开始。

为防止这种情况,您必须保持文件打开并将scanner2变量及其初始化移动到外部 for 循环的前面。您还需要多个Scanner变量,即一个数组,以保持多个文件同时打开。

于 2013-03-13T10:57:51.623 回答