Решение, не самое элегантное, согласен )) Не оптимальное. Но рабочее. У меня.
Помогите, плиз, придумать проверку которая даст сбой (или укажите на ошибку).
Смысл решения - создаем массивы строк равной длины.
Если строка была удалена - во втором массиве на этом месте "", если добавлена, то в первом "".
получаем:
{"строка1", "строка2", "строка3", "" , "строка5", "" }
{"строка1", "" , "строка3", "строка4", "строка5", "строка6"}
package com.javarush.task.task19.task1916;
import jdk.nashorn.internal.ir.IfNode;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/*
Отслеживаем изменения
*/
public class Solution {
public static List<LineItem> lines = new ArrayList<LineItem>();
public static void main(String[] args) throws IOException {
String firstFileName, secondFileName;
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
firstFileName = reader.readLine();
secondFileName = reader.readLine();
reader.close();
ArrayList<String> firstFileData = readFile(firstFileName); // метод readFile считывает строки в массив
ArrayList<String> secondFileData = readFile(secondFileName);
compareArrays(firstFileData, secondFileData); // сравнение считанных массивов и наполниние lines
}
public static ArrayList<String> readFile(String fileName) throws IOException {
ArrayList<String > data = new ArrayList<>();
BufferedReader reader = new BufferedReader(new FileReader(fileName));
while (reader.ready()){
data.add(reader.readLine());
}
reader.close();
return data;
}
public static void compareArrays(ArrayList<String> file1, ArrayList<String> file2){
int lenght = 0;
if (file1.size() > file2.size())
lenght = file1.size();
else lenght = file2.size(); //этот блок находит массив, который длиннее
for (int i = 0; i < lenght; i++) { //этот цикл идет по массивам (не захватывая последний элемент)
if (file1.size() > i+1) { //добавляя пустые строки, если строка была удалена
if (file1.get(i + 1).equals(file2.get(i)))
file2.add(i, "");
}
if (file2.size() > i+1) { //добавляя пустые строки, если строка была добавлена
if (file2.get(i + 1).equals(file1.get(i)))
file1.add(i, "");
}
if (file1.size() > file2.size()) //обновляем значение lenght для цикла
lenght = file1.size();
else lenght = file2.size();
}
if (file1.size() > file2.size()) //смотрим последний элемент(ы) массива(ов)
file2.add("");
if (file2.size() > file1.size())
file1.add("");
// результат - массивы одинаковой длины.
// если строка добавлена, то в первом на этом индексе ""
// если строка удалена, то во втором на этом индексе ""
for (int i = 0; i < file1.size(); i++) { // наполняем lines, методом для сравнения двух элементов массивов
lines.add(compareLines(file1.get(i), file2.get(i)));
}
}
public static LineItem compareLines (String lineFromFirstFile, String lineFromSecondFile){
LineItem result;
if (lineFromFirstFile.equals(lineFromSecondFile))
result = new LineItem(Type.SAME, lineFromFirstFile);
else if (lineFromFirstFile.equals(""))
result = new LineItem(Type.ADDED, lineFromSecondFile);
else
result = new LineItem(Type.REMOVED, lineFromFirstFile);
return result;
}
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;
}
@Override
public String toString() {
String res = type + " " + line;
return res;
}
}
}