Коллеги, студенты помогите обнаружить ошибку, пожалуйста.
Я так понимаю ошибка валидации происходит из-за обработки строк в блоке catch(). Да так делать нельзя.
Подскажите как лучше организовать обработку таких строк, которые находятся в конце файла и их попросту не с чем сравнивать - в старом или в новом файле количество строк больше/меньше?
В таком случае, гарантированно такие строки будут все иметь статус, если они в старом файле(ADDED), в новом(REMOVED).
Рекомендация ментора в валидации на неправильный последний пункт:
Убедись, что список lines в нужных местах содержит операции ADDED c нужными строками.
В строке 37 ошибка комментария - счетчик "y" для строк в новом файле, а не в старомpackage com.javarush.task.task19.task1916;
import java.io.*;
import java.util.*;
import static java.lang.Math.max;
/*
Отслеживаем изменения
*/
public class Solution {
public static List<LineItem> lines = new ArrayList<LineItem>();
public static void main(String[] args) {
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
try (
BufferedReader fileReaderOLD = new BufferedReader(new FileReader(consoleReader.readLine()));
BufferedReader fileReaderNEW = new BufferedReader(new FileReader(consoleReader.readLine()))
)
{
consoleReader.close();
List<String> OLD = new ArrayList<>();
while (fileReaderOLD.ready()){
OLD.add(fileReaderOLD.readLine());
}
fileReaderOLD.close();
List<String> NEW = new ArrayList<>();
while (fileReaderNEW.ready()){
NEW.add(fileReaderNEW.readLine());
}
fileReaderNEW.close();
// Счетчик для строк в старом файле
int y = 0;
for (int i = 0; i < max(OLD.size(), NEW.size()); i++) {
// После каждого ADDED или REMOVED должно следовать SAME (по усл.), но не наоборот!!!!
try {
if (OLD.get(i).equals(NEW.get(y))) {
lines.add(new LineItem(Type.SAME, OLD.get(i)));
// Если строка из старого файла равна следующей строке из нового
} else if (OLD.get(i).equals(NEW.get(y+1))) {
// тогда строка из нового фала была добавлена
lines.add(new LineItem(Type.ADDED, NEW.get(y)));
y++;
// а текущая из старого одинаковая со следующей из нового
lines.add(new LineItem(Type.SAME, OLD.get(i)));
// Проверка, равна ли текущая строка нового файла следующей строке в старом файле
} else if (OLD.get(i+1).equals(NEW.get(y))) {
// тогда строка из старого файла была удалена
lines.add(new LineItem(Type.REMOVED, OLD.get(i)));
// а текущая из нового одинаковая со следующей из старого
i++;
lines.add(new LineItem(Type.SAME, OLD.get(i)));
} else throw new Exception("Для строки из старого файла: ["+OLD.get(i)+"] не нашлось следующей равной строки в новом файле");
y++;
} catch (IndexOutOfBoundsException ex) {
if (i >= OLD.size()) {
lines.add(new LineItem(Type.ADDED, NEW.get(i)));
} else if (i >= NEW.size()) {
lines.add(new LineItem(Type.REMOVED, OLD.get(i)));
}
} catch (Exception ex) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
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;
}
}
}