Чуть ниже был мой первый вопрос с описанием решения....мне добрый человек подсказал, где ошибку искать, я начал думать глубже и.....
В задаче не сказано насколько строки уникальны, мой алгоритм не работал именно из-за возможности одинакового значения у строк. Поясню. Точнее поясните, кто может, какой алгоритм здесь? Вот пример файлов, удовлетворяющих условию, решим? :
file1 file2
abc abc
abc
abc abc
abc
abc abc
abc
abc abc
ожидаемый вывод?.....может просто я туплю.....
package com.javarush.task.task19.task1916;
import jdk.nashorn.internal.ir.IfNode;
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 {
String firstFileName, secondFileName;
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
firstFileName = reader.readLine();
secondFileName = reader.readLine();
reader.close();
ArrayList<String> firstFileData = readFile(firstFileName); // метод readFile считывает строки в массив
ArrayList<String> secondFileData = readFile(secondFileName);
compareArrays(firstFileData, secondFileData); // сравнение считанных массивов и наполниние lines
}
public static ArrayList<String> readFile(String fileName) throws IOException {
ArrayList<String > data = new ArrayList<>();
BufferedReader reader = new BufferedReader(new FileReader(fileName));
while (reader.ready()){
data.add(reader.readLine());
}
reader.close();
return data;
}
public static void compareArrays(ArrayList<String> file1, ArrayList<String> file2){
int lenght = 0;
if (file1.size() > file2.size())
lenght = file1.size();
else lenght = file2.size(); //этот блок находит массив, который длиннее
for (int i = 0; i < lenght; i++) { //этот цикл идет по массивам (не захватывая последний элемент)
if (!file1.get(i).equals(file2.get(i))) {
if (file1.size() > i+1) { //добавляя пустые строки, если строка была удалена
if (file1.get(i + 1).equals(file2.get(i)))
file2.add(i, "");
}
if (file2.size() > i+1) { //добавляя пустые строки, если строка была добавлена
if (file2.get(i + 1).equals(file1.get(i)))
file1.add(i, "");
}
}
if (file1.size() > file2.size()) //обновляем значение lenght для цикла
lenght = file1.size();
else lenght = file2.size();
}
if (file1.size() > file2.size()) //смотрим последний элемент(ы) массива(ов)
file2.add("");
if (file2.size() > file1.size())
file1.add("");
// результат - массивы одинаковой длины.
// если строка добавлена, то в первом на этом индексе ""
// если строка удалена, то во втором на этом индексе ""
for (int i = 0; i < file1.size(); i++) { // наполняем lines, методом для сравнения двух элементов массивов
lines.add(compareLines(file1.get(i), file2.get(i)));
}
}
public static LineItem compareLines (String lineFromFirstFile, String lineFromSecondFile){
LineItem result;
if (lineFromFirstFile.equals(lineFromSecondFile))
result = new LineItem(Type.SAME, lineFromFirstFile);
else if (lineFromFirstFile.equals(""))
result = new LineItem(Type.ADDED, lineFromSecondFile);
else
result = new LineItem(Type.REMOVED, lineFromFirstFile);
return result;
}
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;
}
@Override
public String toString() {
String res = type + " " + line;
return res;
}
}
}