Попробовал разбить задачу на 2 части середина где чередование операций всегда идёт по одному принципу и концовка где каждая концовка предусмотрена исключениями, код работает на многих примерах,только если одинаковые строки находятся рядом,то может отнести их к другим операциям. Попробовал скормить валидатору,и он на всех пунктах выдает вопросы, при запуске без проверки, код проходит. Как понимаю,валидатор не хочет принимать столько различных операций. Но как решить проще не придумал(((
код думаю не стоит анализировать,так как написан коряво и очень много лишнего.
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 {
LineItem line;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String filein1 = reader.readLine();
String filein2 = reader.readLine();
reader.close();
int str = 0;
int counter = 0;
StringBuilder string = new StringBuilder();
ArrayList<String> file1 = new ArrayList<>();
ArrayList<String> file2 = new ArrayList<>();
FileReader reader1 = new FileReader(filein1);
FileReader reader2 = new FileReader(filein2);
while (reader1.ready()) {
str = reader1.read();
if (str != 10) {
string.append((char) str);
counter++;
} else {
string.append((char) str);
counter++;
file1.add(string.toString().replaceAll("\r\n",""));
string.delete(0, counter);
counter = 0;
}
}
file1.add(string.toString());
string.delete(0, counter);
counter = 0;
reader1.close();
while (reader2.ready()) {
str = reader2.read();
if (str != 10) {
string.append((char) str);
counter++;
} else {
string.append((char) str);
counter++;
file2.add(string.toString().replaceAll("\r\n",""));
string.delete(0, counter);
counter = 0;
}
}
file2.add(string.toString());
string.delete(0, counter);
counter = 0;
reader2.close();
int i =0;
int j=0;
while(i<=file1.size()-1&& j<=file2.size()-1&& file1.size()-1!=0){
if(i!=file1.size()-1&& j!=file2.size()-1){
if (file1.get(i).equals(file2.get(j))) {
LineItem lineItem = new LineItem(Type.SAME, file1.get(i));
lines.add(lineItem);
i++;
j++;
}
else{
if (file1.get(i).equals(file2.get(j + 1))) {
LineItem lineItem = new LineItem(Type.ADDED, file2.get(j));
LineItem lineItem1 = new LineItem(Type.SAME, file1.get(i));
lines.add(lineItem);
lines.add(lineItem1);
if(j+2<=file2.size()-1) {
i++;
j = j + 2;
}
else{
i++;
j++;
}
} else {
if (!(file1.get(i).equals(file2.get(j + 1)))) {
LineItem lineItem = new LineItem(Type.REMOVED, file1.get(i));
lines.add(lineItem);
i++;
}
}}
}
if(i!=file1.size()-1 && j== file2.size()-1 && file1.size()<file2.size()){
LineItem lineItem = new LineItem(Type.ADDED, file2.get(j));
lines.add(lineItem);
j++;
}
if(j==file2.size()-1 && file1.size()>=file2.size()){
if (file1.get(i).equals(file2.get(j))) {
LineItem lineItem = new LineItem(Type.SAME, file1.get(i));
lines.add(lineItem);
i++;
}
else {
LineItem lineItem = new LineItem(Type.REMOVED, file1.get(i));
lines.add(lineItem);
i++;
}
}
if(i==file1.size()-1 && file1.size()<=file2.size()){
if (file1.get(i).equals(file2.get(j))) {
LineItem lineItem = new LineItem(Type.SAME, file1.get(i));
lines.add(lineItem);
j++;
}
}
if(i==file1.size()-1 && file1.size()>file2.size()){
if (file1.get(i).equals(file2.get(j))) {
LineItem lineItem = new LineItem(Type.SAME, file1.get(i));
lines.add(lineItem);
j++;
}
}
if(i==file1.size()-1&&j== file2.size()-1&&file1.size()<file2.size()){
if (file1.get(i).equals(file2.get(j-1))) {
LineItem lineItem = new LineItem(Type.ADDED, file2.get(j));
lines.add(lineItem);
i++;
}
else {
LineItem lineItem = new LineItem(Type.REMOVED, file1.get(i));
lines.add(lineItem);
i++;
}
}
if(i==file1.size()-1&&j== file2.size()-1&&file1.size()>file2.size()){
if (file1.get(i).equals(file2.get(j-1))) {
LineItem lineItem = new LineItem(Type.ADDED, file2.get(j));
lines.add(lineItem);
i++;
}
else {
LineItem lineItem = new LineItem(Type.REMOVED, file1.get(i));
lines.add(lineItem);
i++;
}
}
if(i==file1.size()-1&& j!=file2.size()-1&& file1.size()<file2.size()){
if (file1.get(i).equals(file2.get(j + 1))) {
LineItem lineItem = new LineItem(Type.ADDED, file2.get(j));
LineItem lineItem1 = new LineItem(Type.SAME, file1.get(i));
lines.add(lineItem);
lines.add(lineItem1);
if (j + 2 <= file2.size() - 1) {
j = j + 2;
} else {
i++;
j++;
}
}
}
if(i==file1.size()-1 && j!= file2.size()-1 && file1.size()==file2.size()){
LineItem lineItem = new LineItem(Type.ADDED, file2.get(j));
lines.add(lineItem);
j++;
}
}
}
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;
}
}
}