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()を使用して配列内の文字列を分離し、魔法を実行します。

ファイルが大きい場合は、開いたままにして、スペースが見つかるまで各バイトを読み取り、すべてのファイルに対してそれを行い、文字列を比較し、魔法をかけて、すべてのファイルが最後に達するまで繰り返します。

編集 :

  • BufferedReaderでファイルを読み取る方法
  • String.split() で行を分割する方法

文字列行 = readeOneLineFromTheCurrentFile(); String[] words = line.split(" ");

于 2013-03-13T04:12:24.767 に答える
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 に答える
0

単語を一時的にソート/保存するには、PriorityQueue (配列ではなく) a を使用します。申し訳ありませんが、野球を見るのに忙しくて追加できません。

于 2013-03-13T04:10:40.540 に答える