Подскажите, пожалуйста, где логика потерялась.🙂
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 {
ArrayList<String> arrayList1 = new ArrayList<>();
ArrayList<String> arrayList2 = new ArrayList<>();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String file1 = bufferedReader.readLine();
String file2 = bufferedReader.readLine();
bufferedReader.close();
BufferedReader reader1 = new BufferedReader(new FileReader(file1));
BufferedReader reader2 = new BufferedReader(new FileReader(file2));
while (reader1.ready()) {
arrayList1.add(reader1.readLine());
}
while (reader2.ready()) {
arrayList2.add(reader2.readLine());
}
reader2.close();
reader1.close();
classification(arrayList1, arrayList2);
for (LineItem LT : lines) {
System.out.println(LT.type + " " + LT.line);
}
}
public static void classification(ArrayList<String> arrayList1, ArrayList<String> arrayList2) {
// кол-во итераций сравнения - размер самого большого массива
int max = arrayList1.size();
if (arrayList2.size() > max) {
max = arrayList2.size();
}
// индексы элементов для навигации при перемещении по массиву
int index1 = 0;
int index2 = 0;
for (int index = 0; index < max; index++) {
// проверка на то, что за пределы массива не выходим
if (index2 < arrayList2.size() && index1 < arrayList1.size()) {
// если строки одинаковые просто SAME
if (arrayList1.get(index1).equals(arrayList2.get(index2))) {
lines.add(new LineItem(Type.SAME, arrayList1.get(index1)));
// и симетричный сдвиг по обоим массивам
index1++;
index2++;
} else {
// если строки не равные, проверяем добавлена или удалена строка
if (arrayList1.get(index1).equals(arrayList2.get(index2 + 1))) {
lines.add(new LineItem(Type.ADDED, arrayList2.get(index2)));
// строка добавлена, второй массив увеличился сдвиг только по нему
index2++;
// увеличиваем счетчик итераций сравнения потому что строка была добавлена
max++;
} else {
lines.add(new LineItem(Type.REMOVED, arrayList1.get(index1)));
// строка удатена, поэтому сдвиг только по второму массиву
index1++;
}
}
} else {
// так как вышли за пределы массива проверяем за пределы какого и добаляем соответсвующую операцию
if (index2 >= arrayList2.size() && index1 < arrayList1.size()) {
lines.add(new LineItem(Type.REMOVED, arrayList1.get(index1)));
index1++;
} else {
if (index2 < arrayList2.size()) {
lines.add(new LineItem(Type.ADDED, arrayList2.get(index2)));
index2++;
max++;
}
}
}
}
for (LineItem LI : lines) {
System.out.println(LI.type + " " + LI.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;
}
}
}
//D:\Rush\JavaRushTasks\2.JavaCore\src\com\javarush\task\task19\task1916\first.txt
//D:\Rush\JavaRushTasks\2.JavaCore\src\com\javarush\task\task19\task1916\seconde.txt