Сортировщик больших файлов Java

Я делаю задание для своего класса, где у меня есть файл размером 7 Мб. По сути, я должен разбить его на 2 фазы. Этап 1. Я добавляю каждое слово из файла в список массивов и сортирую его в алфавитном порядке. Затем я добавляю каждые 100000 слов в 1 файл, поэтому у меня всего 12 файлов с соглашением об именах, как показано ниже в коде.

Фаза 2: для каждых 2 файлов я читаю одну строку из каждого файла и записываю, какой из них идет первым в алфавитном порядке, в новый файл (в основном сортировка), пока я в конечном итоге не объединю 2 файла в 1, который будет отсортирован. Я делаю это в цикле, так что количество файлов уменьшается вдвое каждый раз при сортировке, так что, по сути, у меня будет 7 МБ, все отсортированные в один файл.

С чем у меня возникли проблемы: на этапе 2 я успешно прочитал этап 1, но кажется, что все мои файлы многократно копируются в несколько файлов, а не сортируются и объединяются. Я ценю любую предоставленную помощь, спасибо.

Файл: Кажется, я не могу загрузить файл.txt, но код должен работать так, чтобы можно было объединить любой файл с любым количеством строк, нужно изменить только переменную количества строк.

Резюме: 1 Большой несортированный файл превращается в несколько отсортированных файлов (например, 12), первая сортировка и объединение превращает его в 6 файлов, вторая сортировка и объединение превращает его в 3 файла, третье объединение превращает его в 2 файла, а четвертое объединение снова превращает его в 1 большой файл. Код:

package Assignment11;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class FileSorter_1 
{
public static ArrayList<String> storyline = new ArrayList<String>();
public static int num_lines = 100000; //this number can be changed
public static int num_files_initial;
public static int num_files_sec;

public static void main(String[] args) throws IOException 
{
    phase1();
    phase2();

}
public static void phase1() throws IOException   
{
    Scanner story = new Scanner(new File("Aesop_Shakespeare_Shelley_Twain.txt")); //file name

    int f = 0;
    while(story.hasNext()) 
    {
        int i = 0;
        while(story.hasNext())
        {
            String temp = story.next(); 
            storyline.add(temp);
            i++;
            if(i > num_lines) 
            {
                break;
            }
        }
        Collections.sort(storyline, String.CASE_INSENSITIVE_ORDER);

        BufferedWriter write2file = new BufferedWriter(new FileWriter("temp_0_" + f + ".txt")); //initialze new file
        for(int x = 0; x<num_lines;x++) 
        {
            write2file.write(storyline.get(x)); 
            write2file.newLine(); 
        }
        write2file.close();

        f++;
    }
    num_files_initial = f;

}

public static void phase2() throws IOException 
{
    int file_n = 1;
    int prev_fn = 0;
    int t = 0;
    int g = 0;
    while(g<5) 
    {
        System.out.println(num_files_initial);
        if(t+1 > num_files_initial-1)
        {
            if(num_files_initial % 2 != 0)
            {

                BufferedWriter w = new BufferedWriter(new FileWriter("temp_"+file_n +"_" + g + ".txt"));
                Scanner file1 = new Scanner(new File("temp_"+prev_fn +"_" + t + ".txt"));
                String word1 = file1.next();
                while(file1.hasNext())
                {

                    w.write(word1);
                    w.newLine();    
                }
                g++;

                break;

            }

            num_files_initial = num_files_initial / 2 + num_files_initial % 2;
            g = 0;
            t = 0;
            file_n++;
            prev_fn++;

        }
        String s1="temp_"+file_n +"_" + g + ".txt";
        String s2="temp_"+prev_fn +"_" + t + ".txt";
        String s3="temp_"+prev_fn +"_" + (t+1) + ".txt";
        System.out.println(s2);
        System.out.println(s3);
        BufferedWriter w = new BufferedWriter(new FileWriter(s1));
        Scanner file1 = new Scanner(new File(s2));
        Scanner file2 = new Scanner(new File(s3));

        String word1 = file1.next();
        String word2 = file2.next();

        System.out.println(num_files_initial);

        //System.out.println(t);
        //System.out.println(g);

        while(file1.hasNext() && file2.hasNext())
        {

            if(word1.compareTo(word2) == 1) //if word 1 comes first = 1
            {
                w.write(word1);
                w.newLine();
                file1.next();
            }
            if(word1.compareTo(word2) == 0) //if word 1 comes second = 0
            {
                w.write(word2);
                w.newLine();
                file2.next();
            }
        }   
        while(file1.hasNext()) 
        {

            w.write(word1);
            w.newLine();
            break;
        }
        while(file2.hasNext()) 
        {

            w.write(word2);
            w.newLine();
            break;
        }

        g++;

        t+=2;
        w.close();
        file1.close();
        file2.close();

    }


}
 }

1 ответ

После записи данных в новые файлы вы не очищаете существующий отсортированный массив, поэтому он копируется в новые файлы. Вот некоторые исправления:

...
    int f = 0;
    while(story.hasNext()) 
    {
        // initilize the array here.
        storyline = new ArrayList<>();
        int i = 0;
        while(story.hasNext())
        {
            String temp = story.next(); 
            storyline.add(temp);
            i++;
            if(i > num_lines) 
            {
                break;
            }
        }
        Collections.sort(storyline, String.CASE_INSENSITIVE_ORDER);

        BufferedWriter write2file = new BufferedWriter(new FileWriter("temp_0_" + f + ".txt")); //initialze new file

        // instead of num_lines use i
        for(int x = 0; x<i;x++) 
        {
            write2file.write(storyline.get(x)); 
            write2file.newLine(); 
        }
        write2file.close();

        f++;
    }
    num_files_initial = f;

Надеюсь это поможет.

Другие вопросы по тегам