Сравнить большой текстовый файл в строку Java по линии


Уважаемые товарищи разработчики я делаю Java-программы, которые сравнивают две текстовые файлы построчно, первого текстового файла строк 99,000 а другой файл 1,15,000 линии. Я хочу читать файлы и сравнивать таким образом, так что если какая-либо линия матчей между первый файл и второй файл надо распечатать матча.

Я написал код, но он занимает почти 10 минут, чтобы закончить, как он печатает из-за for петли. Как это может быть сделано быстро, эффективно и эффективно с точки зрения выделения памяти? Как он может быть оптимизирован для работы? Пожалуйста, руководство меня.

public class Main {

static final String file1 = "file1.txt";
static final String file2 = "file2.txt";

static BufferedReader b1 = null;
static BufferedReader b2 = null;

static List<String> list_file1 = null;
static List<String> list_file2 = null;

public static void main(String[] args) {

    list_file1 = new ArrayList<String>();
    list_file2 = new ArrayList<String>();

    String lineText = null;

    try {
        b1 = new BufferedReader(new FileReader(file1));
        while ((lineText = b1.readLine()) != null) {
            list_file1.add(lineText);
        }
        b2 = new BufferedReader(new FileReader(file2));
        while ((lineText = b2.readLine()) != null) {
            list_file2.add(lineText);
        }
        compareFile(list_file1,list_file2);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

private static void compareFile(List<String> list_file1, List<String> list_file2) {
    for(String content1:list_file1){
        for(String content2:list_file2){
            if(content1.equals(content2)){
                System.out.println("Match Found:-"+content1);
            }
        }
    }
}
}


3569
1
задан 14 февраля 2018 в 11:02 Источник Поделиться
Комментарии
1 ответ

Трудоемкость программы составляет \$О(Н*м)\$ и сложности пространства \$О(Н + м)\$ где 'n' - нет. строк в первом файле и " М " нет. строк второго файла.

Вот оптимизированная версия указанной программы, с течением времени сложность \$О(Н + м)\$ и пространства сложность \$о( мин(М,N) )\$. Я не проверял эту программу, но она должна быть в состоянии представить выход на экране в течение нескольких секунд :)

import java.io.*;
import java.util.*;

class Main{
public static void main(String args[]){
try ( BufferedReader reader1 = new BufferedReader(new FileReader("file1.txt"));
BufferedReader reader2 = new BufferedReader(new FileReader("file2.txt")) ){

//assuming file1.txt is smaller than file2.txt in terms of no. of lines
HashSet<String> file1 = new HashSet<String>();

String s = null;
while( ( s = reader1.readLine()) != null){
file1.add(s);
}

while( (s = reader2.readLine()) != null ){
if(file1.contains(s))
System.out.println(s);
}
}
catch(IOException e){
System.out.println(e);
}

}
}

Примечание: только один файл в памяти и HashSet<> вместо вложенных циклов для сравнения.

3
ответ дан 14 февраля 2018 в 02:02 Источник Поделиться