Написал сам код, реализовал в конце-концов решение на двух массивах, чтобы было нагляднее. Тестовые примеры проходят, но валик не принимает, пишет такое:
Убедись, что список lines в нужных местах содержит операции REMOVED c нужными строками.
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) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName1 = null;
// String fileName1 = "/tmp/file1";
String fileName2 = null;
// String fileName2 = "/tmp/file2";
try {
fileName1 = reader.readLine();
fileName2 = reader.readLine();
reader.close();
} catch (IOException ignored) {}
BufferedReader reader1 = null;
BufferedReader reader2 = null;
try {
reader1 = new BufferedReader(new FileReader(fileName1));
reader2 = new BufferedReader(new FileReader(fileName2));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
ArrayList<String> lines1 = new ArrayList<>();
ArrayList<String> lines2 = new ArrayList<>();
try {
while (reader1.ready()) {
lines1.add(reader1.readLine());
}
reader1.close();
while (reader2.ready()) {
lines2.add(reader2.readLine());
}
reader2.close();
} catch (IOException ignored) {}
while (lines1.size() < lines2.size()) lines1.add(null);
while (lines2.size() < lines1.size()) lines2.add(null);
int i;
int linesSize = lines1.size();
for (i = 0; i < linesSize; i++) {
String l1 = lines1.get(i);
String l2 = lines2.get(i);
if (l1 != null && l2 != null) {
if (!l1.equals(l2)) {
if (l1.equals(lines2.get(i + 1))) {
// 1 0
// 2 1
// 3 2
lines1.add(i, null);
} else if (l2.equals(lines1.get(i + 1))) {
// 0 1
// 1 2
// 2 3
lines2.add(i, null);
}
}
}
}
while (lines1.size() < lines2.size()) lines1.add(null);
while (lines2.size() < lines1.size()) lines2.add(null);
for (i = 0; i < lines1.size(); i++) {
if (lines1.get(i) != null || lines2.get(i) != null) {
if (lines1.get(i) == null) {
lines.add(new LineItem(Type.ADDED, lines2.get(i)));
} else if (lines2.get(i) == null) {
lines.add(new LineItem(Type.REMOVED, lines1.get(i)));
} else if (lines1.get(i).equals(lines2.get(i))) {
lines.add(new LineItem(Type.SAME, lines1.get(i)));
}
}
}
}
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;
}
}
}