Нашёл и исправил некоторые ошибки (например, при ABC и BCA), более найти не могу, валидатор не принимает
package com.javarush.task.task19.task1916;
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 {
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
BufferedReader name = new BufferedReader(new InputStreamReader(System.in));
String name1 = name.readLine();
String name2 = name.readLine();
BufferedReader reader1 = new BufferedReader(new FileReader(name1));
BufferedReader reader2 = new BufferedReader(new FileReader(name2));
while (reader1.ready()) {
list1.add(reader1.readLine());
if (reader2.ready())
list2.add(reader2.readLine());
}
while (reader2.ready())
list2.add(reader2.readLine());
int i2 = 0, i;
if (list1.size() >= list2.size()) {
for (i = 0; i < list1.size(); i++) {
if (i2 >= list2.size()) {
lines.add(new LineItem(Type.REMOVED, "REMOVED " + list1.get(i)));
continue;
}
if (list1.get(i).equals(list2.get(i2))) {
lines.add(new LineItem(Type.SAME, "SAME " + list1.get(i)));
if (i < list1.size() - 1)
i2++;
} else {
if (list1.get(i + 1).equals(list2.get(i2))) {
lines.add(new LineItem(Type.REMOVED, "REMOVED " + list1.get(i)));
lines.add(new LineItem(Type.SAME, "SAME " + list1.get(++i)));
if (i < list1.size() - 1)
i2++;
} else {
lines.add(new LineItem(Type.ADDED, "ADDED " + list2.get(i2)));
i--;
if (i < list1.size() - 1)
i2++;
}
}
}
} else {
i = 0;
for (i2 = 0; i2 < list2.size(); i2++) {
if (i >= list1.size()) {
lines.add(new LineItem(Type.ADDED, "ADDED " + list2.get(i2)));
continue;
}
if (list1.get(i).equals(list2.get(i2))) {
lines.add(new LineItem(Type.SAME, "SAME " + list1.get(i)));
if (i2 < list2.size() - 1)
i++;
}
else {
if (i + 1 < list1.size() && list1.get(i + 1).equals(list2.get(i2))) {
lines.add(new LineItem(Type.REMOVED, "REMOVED " + list1.get(i++)));
lines.add(new LineItem(Type.SAME, "SAME " + list1.get(i)));
if (i < list1.size() - 1 && i2 < list2.size() - 1)
i++;
} else {
lines.add(new LineItem(Type.ADDED, "ADDED " + list2.get(i2)));
if (i < list1.size() - 1 && i2 < list2.size() - 1)
i++;
}
}
}
}
while (i2 < list2.size() - 1) {
i2++;
lines.add(new LineItem(Type.ADDED, "ADDED " + list2.get(i2)));
}
while (i < list1.size() - 1) {
i++;
lines.add(new LineItem(Type.REMOVED, "REMOVED " + list1.get(i)));
}
lines.forEach(a -> System.out.println(a.line));
name.close();
reader1.close();
reader2.close();
}
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;
}
}
}