![](https://cdn.javarush.com/images/system/687dc7c8-2c92-4451-9004-62fe4af60c01/1024.jpeg)
![](https://cdn.javarush.com/images/system/d679f7c4-3f62-4d27-9be1-a2ee8fa8c3a9/1024.jpeg)
![](https://cdn.javarush.com/images/system/5ffd68d3-0d00-4df3-9816-0db759ac411a/original.jpeg)
![](https://cdn.javarush.com/images/system/ccf285ed-df96-4143-9cf4-8efcffc5878b/original.jpeg)
![](https://cdn.javarush.com/images/system/d880e400-b5a1-4a79-b063-90529bd1cbd8/original.jpeg)
![](https://cdn.javarush.com/images/system/d052168c-e33a-4155-81ad-6494e96f4286/original.jpeg)
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;
/*
Отслеживаем изменения
*/
public class Solution {
public static List<LineItem> lines = new ArrayList<LineItem>();
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String file1 = bfr.readLine();
String file2 = bfr.readLine();
bfr.close();
FileReader fileReader1 = new FileReader(file1);
FileReader fileReader2 = new FileReader(file2);
StringBuilder strBuild = new StringBuilder();
ArrayList<String> list1 = new ArrayList<>();
while (fileReader1.ready()) {
String s = String.valueOf((char) fileReader1.read());
if(!s.equals("\r") && !s.equals("\n")) strBuild.append(s);
if(s.equals("\r") || !fileReader1.ready()) {
list1.add(strBuild.toString());
strBuild = new StringBuilder();
}
}
fileReader1.close();
strBuild = new StringBuilder();
ArrayList<String> list2 = new ArrayList<>();
while (fileReader2.ready()) {
String s = String.valueOf((char) fileReader2.read());
if(!s.equals("\r") && !s.equals("\n")) strBuild.append(s);
if(s.equals("\r") || !fileReader2.ready()) {
list2.add(strBuild.toString());
strBuild = new StringBuilder();
}
}
fileReader2.close();
int removed = 0;//Был ли REMOVE сдвиг? Если был - на сколько
for (int i = 0; i < list1.size(); i++) {
String currentString1 = ""; //сравниваемые строки
String currentString2 = "";
int index1 = -5;//сравниваемые индексы
int index2 = -5;
if(removed == 0) {//если сдвига небыло - сравниваем паралельные
currentString1 = list1.get(i);
currentString2 = list2.get(i);
index1 = Character.getNumericValue(currentString1.charAt(currentString1.length()-1));
index2 = Character.getNumericValue(currentString2.charAt(currentString2.length()-1));
}
if(removed == 1) {//если сдвиг на 1
currentString1 = list1.get(i);
if(i == list1.size() - 1 && list2.size() == list1.size() - 2) {
lines.add(new LineItem(Type.REMOVED, currentString1));
continue;
}
currentString2 = list2.get(i - 1);
index1 = Character.getNumericValue(currentString1.charAt(currentString1.length()-1));
index2 = Character.getNumericValue(currentString2.charAt(currentString2.length()-1));
}
if(removed == 2) {//если было 2 REMOVED сдвига
currentString1 = list1.get(i);
// if(i == list1.size() - 1 && list2.size() == list1.size() - 3) {
// lines.add(new LineItem(Type.REMOVED, currentString1));
// }
currentString2 = list2.get(i - 2);
index1 = Character.getNumericValue(currentString1.charAt(currentString1.length()-1));
index2 = Character.getNumericValue(currentString2.charAt(currentString2.length()-1));
}
//блок сравнения
if(index1 == index2) {
lines.add(new LineItem(Type.SAME, currentString1));
if((i == list1.size()-1 && (list1.size() == list2.size() - 1)
|| (list1.size() == list2.size() && removed > 0))) {
String string = list2.get(list2.size() - 1);
lines.add(new LineItem(Type.ADDED, string));
}
continue;
}
else if(index1 == index2 - 1) {
lines.add(new LineItem(Type.REMOVED, currentString1));
removed++;
continue;
}
else if(index1 == index2 + 1) {
lines.add(new LineItem(Type.ADDED, currentString2));
i--;
removed--;
}
}
// for (LineItem s : lines) {
// System.out.println(s.type + " " + s.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;
}
}
}