Доброго времени суток.
Программа работает как задано условиями задачи
Валидатор выдаёт TIME OUT.
Может кто сможет найти причину.
Прошу прощения за закоментированный код, пытаюсь решить другим методом.
package com.javarush.task.task19.task1916;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
Отслеживаем изменения
Считать с консоли 2 имени файла - file1, file2.
Файлы содержат строки, file2 является обновленной версией file1, часть строк совпадают.
Нужно создать объединенную версию строк, записать их в список lines.
Операции ADDED и REMOVED не могут идти подряд, они всегда разделены SAME.
Пустые строки даны в примере для наглядности.
В оригинальном и редактируемом файлах пустых строк нет!
Пример 1:
оригинальный редактированный общий
file1: file2: результат:(lines)
строка1 строка1 SAME строка1
строка2 REMOVED строка2
строка3 строка3 SAME строка3
строка4 REMOVED строка4
строка5 строка5 SAME строка5
строка0 ADDED строка0
строка1 строка1 SAME строка1
строка2 REMOVED строка2
строка3 строка3 SAME строка3
строка4 ADDED строка4
строка5 строка5 SAME строка5
строка0 REMOVED строка0
Пример 2:
оригинальный редактированный общий
file1: file2: результат:(lines)
строка1 строка1 SAME строка1
строка0 ADDED строка0
Пустые строки в примере означают, что этой строки нет в определенном файле.
Требования:
1. Класс Solution должен содержать класс LineItem.
2. Класс Solution должен содержать enum Type.
3. Класс Solution должен содержать публичное статическое поле lines типа List<LineItem>, которое сразу проинициализировано.
4. В методе main(String[] args) программа должна считывать имена файлов с консоли (используй BufferedReader).
5. В методе main(String[] args) BufferedReader для считывания данных с консоли должен быть закрыт.
6. Программа должна считывать содержимое первого и второго файла (используй FileReader).
7. Потоки чтения из файлов (FileReader) должны быть закрыты.
8. Список lines должен содержать объединенную версию строк из файлов, где для каждой строки указана одна из операций ADDED, REMOVED, SAME.
*/
public class Solution {
public static List<LineItem> lines = new ArrayList<LineItem>();
public static void main(String[] args) throws Exception {
List<String> stringFile1 = new ArrayList<>(); //создаем массив 1 для хранения строк из первого файла
List<String> stringFile2 = new ArrayList<>(); //создаем массив 2 для хранения строк из второго файла
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName1 = reader.readLine();
FileReader read1 = new FileReader(fileName1);
Scanner scan = new Scanner(read1);
while (scan.hasNext()) { // добавляем все строки в массив 1 из первого файла
stringFile1.add(scan.nextLine());
}
String fileName2 = reader.readLine();
FileReader read2 = new FileReader(fileName2);
scan = new Scanner(read2);
while (scan.hasNext()) { // добавляем все строки в массив 2 из второго файла
stringFile2.add(scan.nextLine());
}
// закрываем потоки на чтение
scan.close();
read2.close();
read1.close();
reader.close();
int n = 0;
for (int i = 0; i < stringFile2.size(); i++) {
// Проверяем остались ли строки в первом файле
if (n < stringFile1.size()) {
// Если строки равны то SAME
if (stringFile2.get(i).equals(stringFile1.get(n))) {
lines.add(new LineItem(Type.SAME, stringFile2.get(i)));
n++;
// Если строка i из файла 2 не равна строке n из файла 1 и строка i из файла 2 равна строке n+1 из файла 1
} else if (n + 1 == stringFile1.size()) {
lines.add(new LineItem(Type.ADDED, stringFile2.get(i)));
lines.add(new LineItem(Type.SAME, stringFile2.get(++i)));
n++;
} else if (stringFile2.get(i).equals(stringFile1.get(n + 1))) {
lines.add(new LineItem(Type.REMOVED, stringFile1.get(n))); // строку n из файла 1 помечаем REMOVED
lines.add(new LineItem(Type.SAME, stringFile2.get(i))); // строку i из файла 2 помечаем SAME
n = n + 2; // переходим сразу на 2 строки вниз, поскольку обе уже отметили
// Если строка i из файла 2 не равна строке n из файла 1 И строка i из файла 2 не равна строке n+1 из файла 1
} else if (!stringFile2.get(i).equals(stringFile1.get(n + 1))) {
lines.add(new LineItem(Type.ADDED, stringFile2.get(i))); // строку i из файла 2 помечаем ADDED
}
} else { // Если строк в файле 1 не осталось, а в файле 2 остаись, то
lines.add(new LineItem(Type.ADDED, stringFile2.get(i))); // помечаем оставшиеся строки в файле два ADDED
}
}
// Проверяем остались ли строки которые мы не сравнивали в файле 1
if (n < stringFile1.size()) {
lines.add(new LineItem(Type.REMOVED, stringFile1.get(n))); // если строка в файле 1 осталась помечаем её как REMOVED
}
// //БЛОК ДЛЯ ПРОВЕРКИ
// for (LineItem x : lines) {
// System.out.println(x.type + " " + x.line);
// }
}
// BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// String fileName1 = reader.readLine();
// String fileName2 = reader.readLine();
// Scanner scanFile1 = new Scanner(new FileReader(fileName1));
// Scanner scanFile2 = new Scanner(new FileReader(fileName2));
//
// while (true) {
// if (scanFile1.hasNext() && scanFile2.hasNext()) {
// String line2 = scanFile2.nextLine();
// String line1 = scanFile1.nextLine();
// if (scanFile1.hasNext() && scanFile2.hasNext()) {
// if (line1.equals(line2)) {
// lines.add(new LineItem(Type.SAME, line1));
// } else if (!line2.equals(line1)) {
// line1 = scanFile1.nextLine();
// if (line2.equals(line1)) {
// lines.add(new LineItem(Type.REMOVED, line1));
// lines.add(new LineItem(Type.SAME, line2));
// //line1 = scanFile1.nextLine();
// }
// } else if (!line2.equals(line1)) {
// //line1 = scanFile1.nextLine();
// if (!line2.equals(line1)) {
// lines.add(new LineItem(Type.ADDED, line2));
// }
// }
//
// //scanFile1.nextLine();
//
// } else if (scanFile2.hasNext()) {
// //line2 = scanFile2.nextLine();
// lines.add(new LineItem(Type.ADDED, line2));
// } else if (scanFile1.hasNext()) {
// //line1 = scanFile1.nextLine();
// lines.add(new LineItem(Type.REMOVED, line1));
// } else break;
//
// } else if (scanFile2.hasNext()) {
// //String line2 = scanFile2.nextLine();
// //lines.add(new LineItem(Type.ADDED, line2));
// } else if (scanFile1.hasNext()) {
// //String line1 = scanFile1.nextLine();
// //lines.add(new LineItem(Type.REMOVED, line1));
// } else break;
// }
// scanFile1.close();
// scanFile2.close();
// for (LineItem lines : lines) {
// System.out.println(lines.type + " " + lines.line);
// }
//
//
//
public static enum Type {
ADDED, //добавлена новая строка
REMOVED, //удалена строка
SAME //без изменений
}
public static class LineItem {
public Type type;
public String line;
public LineItem(Type type, String line) {
this.type = type;
this.line = line;
}
}
}