Отслеживаем изменения

  • 10
  • Недоступна
Считайте с консоли два имени файла — file1, file2. Эти файлы содержат строки, причём file2 является обновленной версией file1, часть строк совпадают. Создайте объединенную версию строк и запишите их в список lines.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (241)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Андрей22 уровень
16 апреля, 09:26
Мне кажется, эта задача заслуживает звездочку.
Harry20 уровень, Москва
12 апреля, 11:53
Это первая задача за которой я уснул ночью. Делается легко и непринужденно через 2 ArrayList.
Denis Fedotov22 уровень, Москва
31 марта, 18:51
клевая задачка, алгоритм не ахти какой сложный, но пришлось повозится с отладкой в идее и тестовыми файлами, в итоге нашел в исходном коде 3 бага
Николай Захаров22 уровень, Москва
28 марта, 11:43
Божечки... Просто посмотрите на идиота, что составил правильный алгоритм, но забыл добавлять создаваемый объект к списку, потратив еще полчаса на размышления об ошибке...) А вообще, задача крутая. Жаль, правда, что без разбирательств основательных тяжело понять основной алгоритм задания, но в целом, даже получается некая прикладная штука.
Mike Woo24 уровень, Москва
26 марта, 19:55
Максимально просто: столбцы А | Б А1 == Б1 - значит SAME А1 != Б1, но А1 == Б2 - значит Б1 ADDED А1 != Б1 и А1 != Б2 - значит А1 REMOVED Перебрали весь столбец, но остались неиспользованные значения в столбце Б (как в примере №2 в условиях)? Добавляем их как ADDED.
Mike Woo24 уровень, Москва
26 марта, 17:27
Тупил, пока не понял, что по сути это diff. А diff, это, грубо говоря, инструкция, "КАК из файла 1 сделать файл 2". Эдакий патч, если угодно. Формулировка задачи - трэш и угар, с этими их "объединенными версиями строк". Реально, задача элементарная, но кошмарное описание убивает кучу времени.
Александр22 уровень, Казань
22 марта, 11:27
Решал на 3 методах: 1) Первый загоняет в ArrayList строки из файлов
List<String> fileList1 = fileToList(file1);
List<String> fileList2 = fileToList(file2);
2) Второй сравнивает данные в List'ах и выравнивает их - добавляя пустые строки там где надо. а) Если равны или равны "", то запускаем рекурсию только на вход текущие позиции + 1. б) Если строки крест на крест то добавляем пустую строку в первый лист, чтобы их выровнять и запускаем рекурсию с позиции + 2. в) Если строки крест на крест то добавляем пустую строку во второй лист,чтобы их выровнять и запускаем рекурсию с позиции + 2.
compareAndAddStrings(fileList1, 0, fileList2, 0);
3) С 3 просто - сравниваем построчно List'ы и добавляем в lines
compareLists(fileList1, fileList2);
Anastasiia20 уровень
19 марта, 17:49
это задача свела меня с ума
Petrusiova23 уровень
19 марта, 11:25
Ушло пол дня... - создаем и считываем в 2 ArrayList-а строки из 2-х файлов - ПОПАРНО сравниваем значения (т.е. list1.get(0) сравниваем с list2.get(0)) - если equals, то это тип SAME - иначе сравниваем: list1.get(1) совпадает ли с list2.get(0) , если да - REMOVED - иначе: list1.get(0) совпадает ли с list2.get(1) , если да - ADDED - удаляем значения, которые уже проверили и внесли в lines В конце проверяем не осталось ли в list1 и list2 значений, если да: - все из list1 - REMOVED - все из list2 - ADDED
Руслан20 уровень, Москва
20 марта, 18:35
Дай Бог тебе здоровья! Решил с первого раза)
22 марта, 15:17
Тоже сделал примерно по подобному алгоритму. Только иногда можно так построить 2-ой файл, что будет возникать ситуация, когда можно выйти за пределы arraylista при сравнении строк типа ADD, REMOVE и соответственно выбросится исключение. Но валидатор всё равно принимает этот вариант
Petrusiova23 уровень
22 марта, 15:59
у меня для этого цикл в цикле, чтобы за границы как раз не выходить
Don Fear25 уровень, Екатеринбург
19 марта, 09:06
Никаких статических переменных! Никаких! 5 попыток в топку!
Николай22 уровень
19 марта, 10:22
Я вам больше скажи - забудьте статики как страшный сон. За редким и очень редким исключением это будет явным нарушением принципов ООП.
Don Fear25 уровень, Екатеринбург
19 марта, 12:47
Да, согласен, статики - зло. По хорошему мы должны создавать отдельный объект, с внутренней логикой, а не фигачать всё в "static void main". Но почему нигде не указано, что валидатор будет ругаться именно на них, это довольно странно.
Николай22 уровень
19 марта, 14:36
просто если не фигачить сейчас все в main, то и запустить для проверки не получится.
Don Fear25 уровень, Екатеринбург
20 марта, 07:50
Вооот! Отсюда и получается вопрос со статиками. Когда хочешь их использовать для удобства или упрощение, а валидатор насильственно заставляет разводить ещё больший колхоз.
Николай22 уровень
20 марта, 09:48
ну не знаю. По идее нужно изначально настраиваться - статики только там, где о них просят.