мне непонятен алгоритм, если файлы будут с другими строками, то смысл теряется и нереально чередовать REMOVED||ADDED с SAME
я сначала подумал есть закономерность, типо, в первом файле, строки идут по порядку, от 1 до 5 с некоторыми пропусками, а во втором также по порядку с пропусками либо с добавлением новых строк, которые не рушат последовательность
КОРОЧЕ ничего не понял(
help!
алгоритм работает, проверял на условиях которые даны в задаче.
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) {
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//String g=reader.readLine();
String file1=reader.readLine();
String file2=reader.readLine();
reader.close();
BufferedReader readFile1 = new BufferedReader(new FileReader(file1));
BufferedReader readFile2 = new BufferedReader(new FileReader(file2));
ArrayList<String> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
while(readFile1.ready()||readFile2.ready()){//добавляю строки из двух файлов, в разные list1 и list2
if(readFile1.ready()){
String fromFile1 = readFile1.readLine();
list1.add(fromFile1);
if(readFile2.ready()){
String fromFile2 = readFile2.readLine();
list2.add(fromFile2);
}
}
else{
String fromFile2 = readFile2.readLine();
list2.add(fromFile2);
}//проверил, работает, строки добавляет как положено
}
readFile1.close();//закрыл потоки первого файла
readFile2.close();//закрыл потоки второго файла
boolean ifList1BiggerThenList2=list1.size()>list2.size();
if(ifList1BiggerThenList2){//проверяю какой из файлов содержит больше строк
int i2=0;//индекс для второго редактируеого листа(файла)
for(int i1=0;i1<list1.size();i1++){//цикл
if(i2!=list2.size()){//проверяю не вышил ли за пределы массива list2
if(list1.get(i1).equals(list2.get(i2))){//равны ли первые строки из list1 и list2
lines.add(new LineItem(Type.SAME, list1.get(i1)));//добавил SAME
i2++;//итерирую для list2
}
else{//если не равны первые элементы, проверяю равен ли элемент из list2,
// элементу list1 с индеком на 1 больше, чем у list2
if(list2.get(i2).equals(list1.get(i1+1))){
lines.add(new LineItem(Type.REMOVED, list1.get(i1)));
i1++;//итерирую для list1
lines.add(new LineItem(Type.SAME,list1.get(i1)));
i2++;//итерирую для list2
}
else{//элемент list1 c индеком больше на 1 чем у list2, не равны
i2++;//(итерирую для list2)значит строки были добавлены
if(list2.get(i2).equals(list1.get(i1))){
//проверяю равны ли элемент из list1 элементу list2 с индексом
// на 1 больше, чем у list2
lines.add(new LineItem(Type.ADDED, list2.get(i2-1)));
lines.add(new LineItem(Type.SAME,list2.get(i2)));
i2++;
}
}
}
}
else{//если один из спиков закончился, то по остаточному принципу чередую REMOVED с SAME
lines.add(new LineItem(Type.REMOVED,list1.get(i1)));
if(i1!=list1.size()-1){
lines.add(new LineItem(Type.SAME,list1.get(i1)));
}
else{
break;
}
}
}
}
else{ //лист 2 больше чем лист 1, второй алгорит работает по такому же принципу как и первый
int i1=0;
for(int i2=0;i2<list2.size();i2++){
if(i1!=list1.size()){
if(list2.get(i2).equals(list1.get(i1))){
lines.add(new LineItem(Type.SAME, list1.get(i1)));
i1++;
}
else{
if(list2.get(i2).equals(list1.get(i1+1))){
i1++;
if(list2.get(i2).equals(list1.get(i1))){
lines.add(new LineItem(Type.REMOVED, list1.get(i1-1)));
lines.add(new LineItem(Type.SAME,list1.get(i1)));
i1++;
}
}
else{
i2++;
if(list2.get(i2).equals(list1.get(i1))){
lines.add(new LineItem(Type.ADDED, list2.get(i2-1)));
lines.add(new LineItem(Type.SAME,list2.get(i2)));
i1++;
}
}
}
}
else{
lines.add(new LineItem(Type.ADDED,list2.get(i2)));
if(i2!=list2.size()-1){
lines.add(new LineItem(Type.SAME,list2.get(i2)));
}
else{
break;
}
}
}
}
for(LineItem pair:lines){
System.out.println(pair.type+" "+pair.line);
}
}
catch(IOException e){
System.out.println(e);
}
}
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;
}
}
}