Как сравнить два плоских файла/мапы в java
Всем, привет, попробую быть кратким. Есть задача - мне нужно сравнить два плоских файла и вывести разницу в таком формате
chars1: [a, b, c]
- chars2: [d, e, f]
+ chars2: false
- checked: false
+ checked: true
Где, если строка (ключ-значение) был одинаков и в 1ом и во 2ом файле - оставить ключ-значение без изменений, если в 1ом файле ключ был, а во 2ом был удален или изменен - добавить перед ключом знак "-", а если в 1ом файле ключа не было,а во 2ом появился - добавить перед ключом знак "+"
Ниже пример моего кода. Сейчас он не работает корректно, выдает пустые скобки {}
ПС. У меня есть простой парсер файлов - Parser.parser(), реализован в другом классе, который ищет файлы по абсолютным / относительным ссылкам, он работает корректно, был проверен ранее, когда у меня был другой основной код и вся инфа выводилась. Щас код не воркает, я голову сломал над проблемой
Код:
public class Differ {
public static LinkedHashMap<String, Object> generate(String path1, String path2) throws IOException {
String resultString = "{ \n";
TreeMap<String, Object> map1 = Parser.parser(path1);
TreeMap<String, Object> map2 = Parser.parser(path2);
TreeMap<String, Status> mapWithStatusKeys = compareMaps(map1, map2);
Set<String> set = new TreeSet<>(map1.keySet());
Set<String> set2 = new TreeSet<>(map2.keySet());
set.addAll(set2);
LinkedHashMap<String, Object> resultMap = new LinkedHashMap<>();
for (var key : set) {
if (mapWithStatusKeys.get(key).equals("unchanged")) {
resultMap.put(key, map1.get(key));
resultString += " ".repeat(4) + key + ": " + map1.get(key) + "\n";
} else if (mapWithStatusKeys.get(key).equals("changed")) {
resultMap.put("-" + key, map1.get(key));
resultMap.put("+" + key, map2.get(key));
resultString += " ".repeat(2) + "-" + key + ": " + map1.get(key) + "\n";
resultString += " ".repeat(2) + "+" + key + ": " + map2.get(key) + "\n";
} else if (mapWithStatusKeys.get(key).equals("deleted")) {
resultMap.put("-" + key, map1.get(key));
resultString += " ".repeat(2) + "-" + key + ": " + map1.get(key) + "\n";
} else if (mapWithStatusKeys.get(key).equals("added")) {
resultMap.put("+" + key, map2.get(key));
resultString += " ".repeat(2) + "+" + key + ": " + map2.get(key) + "\n";
}
}
resultString += "}";
for (Map.Entry<String, Object> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " - " + entry.getValue());
}
return resultMap;
}
public static TreeMap<String, Status> compareMaps(TreeMap<String, Object> map1, TreeMap<String, Object> map2) {
String resultString = "{ \n";
TreeMap<String, Status> resultMap = new TreeMap<>();
for (String everyKey : map1.keySet()) {
String key = everyKey;
Object value1 = map1.get(everyKey);
if (map2.containsKey(everyKey)) {
Object value2 = map2.get(everyKey);
if (compareValues(value1, value2)) {
resultMap.put(key, new Status(key, "unchanged"));
} else {
resultMap.put(key, new Status(key, "changed"));
}
} else {
resultMap.put(key, new Status(key, "deleted"));
}
}
for (String everyKey : map2.keySet()) {
String key = everyKey;
Object value2 = map2.get(everyKey);
if (!map1.containsKey(everyKey)) {
resultMap.put(key, new Status(key, "added"));
}
}
return resultMap;
}
public static boolean compareValues(Object value1, Object value2) {
if (value1 == null && value2 == null) {
return true;
}
if (value1 == null || value2 == null) {
return false;
}
return value1.toString().equals(value2.toString());
}
Класс статус:
public class Status {
private final String value;
private final String status;
public Status(String value, String status) {
this.value = value;
this.status = status;
}
public String getValue() {
return value;
}
public String isStatus() {
return status;
}
Подскажите пожалуйста, в чем затуп. Мне нужно
- Создать структуру, которая будет содержать разницу между двумя файлами(мапами), я думаю использтовать линкедХэшМэп, и вносить туда значения, изменяя ключи, так я сохраню все значения и сохраню порядок добавления.
- Вывести в итоге отформатированную сроку - разницу.
Это все пытаюсь сделать в цикле фор основного метода generate. Код не работает, может кто-то подсказть в чем дело? Спасибо
Ответы (1 шт):
Ошибка простейшая, сразу ее нашел почти.
В цикле фор, коий обходит все значения по сету я неправильно брал из мапы mapWithStatusKeys,я брал mapWithStatusKeys.get(key).equals("unchanged"), и в итоге я пытался сравнить со строкой unchanged объект класса Status, изменил условия на такое:
if (mapWithStatusKeys.get(key).isStatus().equals("unchanged"))
все пофиксилось!:)
Мб кому-то будет полезно