Мне нужно обработать входной файл и скопировать его содержимое (строка за строкой) в выходной файл. Однако внутри этого входного файла есть некоторые неважные данные (бродячие), которые мне нужно пропустить. Основная проблема, которую я пытаюсь решить, на самом деле сложнее этой, но я просто упрощу ее:
Итак, у меня есть входной файл, содержащий сотни тысяч строк. Если во входном файле встречается следующая последовательность из 3 строк:
A
B
C
то мне нужно пропустить эти 3 строки и перейти к следующей строке во входном файле. Я могу пропустить эти 3 строки только в том случае, если эти 3 строки представляют собой последовательность последовательных строк.
Например:
Входной файл:
A
A
B
C
B
P
A
B
C
A
B
A
A
B
C
A
Выходной файл:
A
B
P
A
B
A
A
Уточнение:
A
A (пропущено)
B (пропущено)
C (пропущено)
B
P
A (пропущено)
B (пропущено)< br> C (пропущено)
A
B
A
A (пропущено)
B (пропущено)
C (пропущено)
A
Обратите внимание, что я могу пропустить последовательность строк (A, B, C), только если они идут последовательно. Все остальные строки, которые не пропущены, должны быть скопированы в выходной файл. Если я использую BufferedReader.nextLine(), я не могу вернуться к предыдущим строкам, если следующая строка не соответствует входному шаблону. Например, если я уже встречаю A, а следующая строка — это другая A (не B), тогда мне нужно скопировать первую A в выходной файл и снова начать фильтрацию со второй A, которую я не обработал, и проверьте следующую строку и так далее.
Один из способов, который я могу придумать, - это сначала сохранить содержимое входного текстового файла, чтобы я мог легко вернуться назад при просмотре содержимого входного файла, если он не соответствует шаблону, который я ищу. Однако это не решение для памяти. Есть ли какой-нибудь умный алгоритм для решения этого, желательно за один раз, т.е. сложности O (N)? Или, если это невозможно, какое решение было бы наиболее оптимальным, которое по-прежнему зависит от памяти? Некоторые примеры кодов C/Java будут действительно полезны.