Hi,
Tried multiple solutions, couldn't resolve it.
Also I couldn't find a complete working solution in colleagues comments for this task.
Please post a complete working solution, so that I can do reverse engineering and then try to understand the requirement. Honestly, the requirement is bit confusing and am not able to understand it properly.
package com.codegym.task.task19.task1916;
import javax.swing.text.AbstractDocument;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/*
Tracking changes
*/
public class Solution {
public static List<LineItem> lines = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String file1 = br.readLine();
String file2 = br.readLine();
br.close();
/* String file1 = "C:\\Users\\user\\OneDrive\\Desktop\\6.txt";
String file2 = "C:\\Users\\user\\OneDrive\\Desktop\\7.txt";*/
BufferedReader file1Reader = new BufferedReader(new FileReader(file1));
BufferedReader file2Reader = new BufferedReader(new FileReader(file2));
List<String> originalFile = getLines(file1Reader);
file1Reader.close();
List<String> updatedFile = getLines(file2Reader);
file2Reader.close();
fillUpLines(originalFile, updatedFile);
//insertAddLines(originalFile, updatedFile);
//lines.stream().forEach(lin -> System.out.println(lin.type.toString()+ " " + lin.getLine()));
}
private static void fillUpLines(List<String> originalFile, List<String> updatedFile) {
List<LineItem> addOrRemoveItems = new ArrayList<>();
int size = originalFile.size() > updatedFile.size() ? originalFile.size() : updatedFile.size();
for(int i = 0; i < size; i++) {
String originalLine = i < originalFile.size() ? originalFile.get(i) : "";
String updatedLine = i < updatedFile.size() ? updatedFile.get(i) : "";
if (originalLine.equals(updatedLine)) {
lines.add(new LineItem(Type.SAME, originalLine));
if(addOrRemoveItems.size() > 0) lines.add(addOrRemoveItems.remove(0));
} else if (!updatedFile.contains(originalLine)) {
if(lines.get(lines.size()-1).type == Type.SAME) {
lines.add(new LineItem(Type.REMOVED, originalLine));
}else {
addOrRemoveItems.add(new LineItem(Type.REMOVED, originalLine));
}
} else if (!originalFile.contains(updatedLine)) {
if(lines.get(lines.size()-1).type == Type.SAME) {
lines.add(new LineItem(Type.ADDED, updatedLine));
}
else {
addOrRemoveItems.add(new LineItem(Type.ADDED, updatedLine));
}
}
}
}
private static void insertAddLines(List<String> originalFile, List<String> updatedFile) {
for(int i = 0; i < updatedFile.size(); i++) {
String updatedLine = updatedFile.get(i);
//if not contains, then its an add case
if(!originalFile.contains(updatedLine)) {
//insert at index greater than given index
if(i < lines.size() - 2) {
insertLine(updatedLine, i);
}
else {
lines.add(new LineItem(Type.ADDED, updatedLine));
}
}
}
}
private static void insertLine(String line, int index) {
while(index < lines.size() - 2) {
LineItem lineItem1 = lines.get(index);
LineItem lineItem2 = lines.get(index+1);
if(Type.SAME == lineItem1.type && lineItem1.type == lineItem2.type) {
lines.add(index+1, new LineItem(Type.ADDED, line));
break;
}
index++;
}
}
private static List<String> getLines(BufferedReader br) throws IOException {
List<String> lines = new ArrayList<>();
while (br.ready()) {
lines.add(br.readLine());
}
return lines;
}
private static Type getLastLineType() {
LineItem lineItem = lines.size() > 0 ? lines.get(lines.size() - 1) : null;
return lineItem != null ? lineItem.type : null;
}
public static enum Type {
ADDED, // New line added
REMOVED, // Line deleted
SAME // No change
}
public static class LineItem {
public Type type;
public String line;
public LineItem(Type type, String line) {
this.type = type;
this.line = line;
}
public String getLine() {
return this.line;
}
}
}