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

  • 20
  • Недоступна
Считайте с консоли два имени файла — file1, file2. Эти файлы содержат строки, причём file2 является обновленной версией file1, часть строк совпадают. Создайте объединенную версию строк и запишите их в список lines.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (443)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Vitalachka19 уровень, Лондон
Friday, 22:13
не вероятно не могу поверить я отделалась от этой задачи! вариант с добавлением пустых строк в лист Валя забраковал, по последнему пункту, хотя вариант был рабочим на все 100% работал как часики. в итоге пропустил с чужим кодом, НО надо сказать этот вариант очень изящный и если вы искали такой код, то в комментариях у Евгений Черный за 25 March 2020, 11:39 Всем Удачи! на данный момент Всего эту задачу решили 9517 учеников.
Vad22 уровень
9 June, 19:25
Когда-то я писАл, о том, что складывается впечатление, что гуглтранслейт задания пишет.?))) Кажется наткнулся на первоисточник: https://codegym.cc/ Теперь ясно, почему вроде русский текст, но ни фига не поймёшь, о чём он.)) У англоговорящих алгоритм построения логических речевых цепочек другой. Гуглтранслейт с этими тонкостями пока не справляется. Из-за этого и задание такими бредовыми иной раз кажутся. В общем-то, спасибо, что хоть так перевели: Зато теперь можно было бы оригинал и перевод совместить...но для этого на инглиш-версии пришлось бы сперва все задачи по новой решать, чтоб совместить уровни)) Кстати: Удалось заглянуть в комменты к задачам. Там тоже ругают авторов...только на английском.
Mikhail20 уровень, Москва
8 June, 16:49
27 попыток
Wally Dator20 уровень, Чехов
6 June, 15:06
Два списка(с добавлением флагов их окончания!) Один for. Два If на логику сравнения строк файлов. Один If на окончание списков. 4 часа трудов(скорее раздумий)) "Wally Dator" принимает при любой последовательности строк в файлах, исключений не возникает. Но, всё таки хочется верить , что есть более изящные решения по сравнению.
Рустам22 уровень, Санкт-Петербург
5 June, 16:19
Сложность задач на джавараш зависит от туманности их формулировок kek
Наталья27 уровень, Санкт-Петербург
19 May, 09:00
А может быть такое что: строка5 строка0 строка1 строка2 строка3 строка4 строка5 ??
Terver20 уровень, Владивосток
19 May, 11:13
Нет, по условию задачи. Операции ADDED и REMOVED не могут идти подряд, они всегда разделены SAME.
Наталья27 уровень, Санкт-Петербург
23 May, 10:43
Спасибо
Wally Dator20 уровень, Чехов
6 June, 15:15
мой код справился с вашей задачей
ADDED  строка0
ADDED  строка1
ADDED  строка2
ADDED  строка3
ADDED  строка4
SAME  строка5
Дмитроченко Антон41 уровень, Санкт-Петербург
16 May, 12:51
По мне так все - таки самый простой способ, с понятной логикой - это уровнять 2 списка, путем вставки пустой строки в тот или иной список, затем там где эти пустые строки появились, получается ADD и REMOVE. Получается два одно проходных цикла. При желание, второй цикл, который в принципе работает только на "вывод", можно запихнуть в первый, тогда асимптотика будет вообще равна О(N).... если 2 цикла, то O(2N), но это не меняет сильно сути.
Андрей23 уровень, Москва
31 May, 12:45
Тоже сначала так подумал, а потом решил просто применять инкремент\декремент индекса в зависимости от ADD\REMOVE.
Raphael35 уровень, Москва
12 May, 05:34
Не рекомендую писать примитивно через цикл for с кучей If else else if.... цикл учитывая все условия получается таким длинным (используя 2 ArrayList)
Raphael35 уровень, Москва
12 May, 05:38
Цикл конечно заработает, но лучше ищите более короткий путь... наверняка существуют какие-то готовые методы сравнения файлов
Leonid40 уровень, Киев
22 May, 19:33
Какая еще куча? Два ифа так как есть 3 возможных значения енума, 10 строк кода.
Wally Dator20 уровень, Чехов
6 June, 15:18
Ну вот вы с высоты 35-го уровня и подскажите какие существуют готовые методы.
Антон22 уровень
7 May, 19:12
Потратил на задачу около двух часов. Немного страшновато было заходить в обсуждение задачи после решения. Думал, что мой код - эталон г...нокода, оказалось, я далеко не один такой )
Leonid40 уровень, Киев
1 May, 14:10
Код получился относительно длинный, 28 строк метода main. Заглянул сюда в поисках чего-то лучше и понял, что своим не стыдно поделиться. Для начала делаем два листа, вот самый оптимальный способ, который удовлетворяет валидатор:
try (BufferedReader reader1 = new BufferedReader(new FileReader(path1));
BufferedReader reader2 = new BufferedReader(new FileReader(path2))){
    file1 = reader1.lines().collect(Collectors.toList());
    file2 = reader2.lines().collect(Collectors.toList());
}
Далее нам нужно бежать циклом по первому списку, заглядывая при этом во второй. Тут некоторые вставляли в списки пустые строки, удаляли нулевые элементы - это все лишние операции и потеря производительности. Я просто ввел второй счетчик:
int j = 0;
for (int i = 0; i < file1.size(); i++) {
    if (j < file2.size() && file1.get(i).equals(file2.get(j))) {
        lines.add(new LineItem(Type.SAME, file1.get(i)));
        j++;
    } else if...
Ну и дальше еще одно условие для ADDED и else для REMOVED . Поскольку мы проходим по первому файлу, во втором в конце могут остаться нерассмотренные строки. Решение вопроса, благодаря тому, что j продолжает хранить нужный индекс:
for (; j < file2.size(); j++) {
    lines.add(new LineItem(Type.ADDED, file2.get(j)));
}
Андрей27 уровень, Санкт-Петербург
4 May, 10:21
Привет! Задам тебе тот же вопрос, что и предыдущему комментатору - твой вариант будет корректно работать с таким набором: строка1 строка0 строка1 ? Копипастить и проверять твой код нет уже сил. Эта задача меня прикончит :)
Leonid40 уровень, Киев
4 May, 15:15
Привет! Разумеется будет, иначе как бы он прошел валидацию? Тут включается в работу последний третий кусок кода, который я привел в сообщении.
Андрей27 уровень, Санкт-Петербург
4 May, 16:36
Спасибо! А по поводу валидации выясняется, что иногда проходят тесты и неполные решения...
Андрей Шевченко20 уровень, Москва
22 May, 21:48
решил аналогично, спасибо за второй кусочек для случая когда в новом файле больше строк, чем в старом
Алексей Иванов22 уровень, Cheboksary
31 May, 19:48
подскажи пожалуйста условия для REMOVED насколько я понимаю, будет так
if (j < file2.size() && file1.get(i+1).equals(file2.get(j)))
где и как ты делаешь проверку на то, что i+1 не выйдет из диапазона file1 Задачу я решил, но все эти проверки заняли очень много кода. И мне не нравится это
Leonid40 уровень, Киев
31 May, 20:10
В первом посте я видать перепутал, REMOVED у меня в последнем else без условия. А вот для ADDED.
else if (j < file2.size() && file1.get(i).equals(file2.get(j + 1)))
Кода там всего ничего, не знаю, может ты чего лишнего написал?
Алексей Иванов22 уровень, Cheboksary
1 June, 06:36
Может и лишнего. Потому что я проверял, что j+1 не выйдет из диапазона fie2 чтобы не ловить Exception. Ну да. Мой код работает даже если есть несколько REMOVED или ADDED подряд (но не ADDED сразу после REMOVED) Хотя по условию задачи этого не требовалось. Видимо я перестарался
Алексей Чумаков27 уровень, Ногинск
5 June, 17:00
Решил практически так-же, правда немного усложнил код, так как умудрился обойтись одним циклом фор, но добавив несколько if
Leonid40 уровень, Киев
5 June, 17:12
Да там и нужен только 1 цикл. Второй это излишество, его можно заменить на if так как больше 1й строки в файле остаться не может по условию. А несколько if зачем?
Алексей Чумаков27 уровень, Ногинск
6 June, 09:11
по условию задачи нет, но тестировал так чтобы обрабатывались и такие ситуации