Лимасол, Кипр
Постановка задачи:
Необходимо разработать приложение для Android (минимальная версия Android — 5.0):
- Пользователь вводит URL текстового файла, указывает фильтр отбора строк и запускает загрузку (например, нажатие кнопки).
- Приложение подгружает файл, отбирает строки, удовлетворяющие фильтру, и отображает их в виде списка.
Принцип отбора строк:
Предполагается, что текстовый файл является текстовым ANSI-файлом (закладываться на UTF-8 не нужно).
Отбор строк осуществляется по условиям простейшего regexp: (как минимум операторы * и ?):
- cимвол '*' - последовательность любых символов неограниченной длины;
- cимвол "?" - один любой символ;
- должны корректно отрабатываться маски: *Some*, *Some, Some*, *****Some*** - нет никаких ограничений на положение * в маске.
Результатом поиска должны быть строки, удовлетворяющие маске.
Например:
- Маска *abc* отбирает все строки, содержащие abc и начинающиеся и заканчивающиеся любой последовательностью символов.
- Маска abc* отбирает все строки, начинающиеся с abc и заканчивающиеся любой последовательностью символов.
- Маска abc? отбирает все строки, начинающиеся с abc и заканчивающиеся любым дополнительным символом.
- Маска abc отбирает все строки, которые равны этой маске.
Требования к реализации:
- Отбор строк должен быть реализован на С++ в составе отдельного класса. Класс не будет расширяться и не будет базовым
классом. Единственная задача: сканирование и поиск текстовых строк. При реализации С++ части запрещено
использование сторонних библиотек и STL. В частности запрещено
использовать <regex> и <ifstream>. Весь парсинг должен быть реализован на С++.
Класс должен иметь следующий публичный интерфейс:
class CLogReader
bool SetFilter(const char *filter); // установка фильтра строк, false - ошибка
{
public:
CLogReader(...);
~CLogReader(...);bool AddSourceBlock(const char* block,const size_t block_size); // добавление очередного блока текстового файла
}; - Размер исходного текстового файла (и, возможно, результатов) может быть от сотен мегабайт.
- Для реализации загрузки и отображения данных должен использоваться Java. Использование Kotlin запрещено.
- Затраты памяти должны быть минимальны (в разумных пределах).
- Результаты парсинга должны писаться в файл results.log в каталоге приложения.
- Результат должен быть представлен в виде списка (ListView), который должен наполняться во время парсинга по мере нахождения новых строк, удовлетворяющих условию. Должна быть возможность выделить одновременно несколько строк с последующим их копированием в буфер обмена.
- Интерфейс не должен блокироваться (приводить к ANR) во время скачивания и обработки данных.
- Код должен быть абсолютно «неубиваемым» и защищённым от ошибок.
Требования к оформлению:
- Код должен быть максимально простым.
- Код должен быть максимально чистым, красивым и понятным.
- Результатом должен быть готовый проект приложения в Android Studio, помещённый в ZIP-архив.