Решение тестовой задачи для NexignBootcamp 2023
Ссылка на исходники задачи: Тестовая задача Nexign Bootcamp 2023
- Парсинг файла cdr.txt - проверка типа звонка, номера телефона, даты начала/конца звонка и тип тарифа.
- Каждую сторку из файла cdr.txt сохраняем в hashMap, где ключ - номер телефона, а значение - список всех звонков с этого номера.
- После того, как закончится парсинг файла cdr.txt, сортируем звонки каждого номера по типу звонка и его дате начала.
- Сохранем полученные данные в отдельных файлах отчёта в виде таблцы.
- Вуа-ля.
Полученный алгоритм можно оптимизировать, поделив файл cdr.txt на несколько блоков. Таким образом эти блоки можно распределить по отдельным потокам, в которых будет работать описаный выше алгоритм приминительно к каждому блоку.
Весь проект состоит из:
- Класс Main - парсинг CDR (cdr.txt), сохранение данных в хеш-таблице и вызов генератора отчётов.
- Класс ReportGenerator - сортировка данных и генерация отчётов (.txt) для каждого номера телефона.
- Enum TariffType - этот енам отвечает за типы тарифов и вычисление стоимости по минутам и типу звонка (входящий/исходящий)
- Record CallDataRecord - единичная CDR запись из файла cdr.txt
- CallDataRecordComparator - компаратор для сортировки коллекции (CallDataRecord) по типу звонка и дате начала звонка.
CDR - сall data record - формат файла, содержащего в себе информацию о времени, стоимости и типа вызова абонента.
В зависимости от вендора, cdr может быть в разном формате, но всегда содержит следующие данные:
- тип вызова (01 - исходящие, 02 - входящие)
- номер абонента (все номера сгенерированы. все совпадения случайны)
- дата и время начала звонка (YYYYMMDDHH24MMSS)
- дата и время окончания звонка
- тип тарфа (см. ниже)
Вот пример готовой записи cdr:
02, 79876543221, 20230321160455, 20230321163211, 11
Тарифов всего 3:
- (06) Безлимит 300: 300 минут - за тарифный период* стоят фиксированную сумму - 100р. Каждая последующая минута - 1р. *Тарифным периодом будем считать все звонки совершенные в текущей выгрузке.
- (03) Поминутный: 1 минута разговора - 1.5 рубля.
- (11) Обычный: входящие - бесплатно, исходящие - первые 100 минут по 0.5р/минута, после по тарифу "поминутный".
Конечная задача будет протарифицировать абонентов: т.е. генерировать файл отчета для каждого абонента, содержащий в себе номер, индекс тарифа, все совершенные звонки в календарном порядке с выпиской их стоимости по тарифу (для безлимита первые 300 минут - 0р, а с 301 уже расчет), продолжительность звонка, итоговая сумма списания.
Для реализации функционала разрешается использовать только средства стандартной библиотеки java (JDK 11). Система сборки - maven. Приложение должно содержать рабочий метод main() для запуска генератора отчетов. Отчеты собирать в директорию reports в корневой папке проекта.
Tariff index: 00
Report for phone number 70710126371:
Call Type | Start Time | End Time | Duration | Cost |
---|---|---|---|---|
01 | 2023-02-03 05:55:06 | 2023-02-03 06:02:49 | 00:07:43 | 5.00 |
01 | 2023-05-23 21:37:39 | 2023-05-23 21:45:27 | 00:07:48 | 5.00 |
01 | 2023-08-24 06:16:23 | 2023-08-24 06:27:35 | 00:11:12 | 5.00 |
01 | 2023-09-08 09:38:34 | 2023-09-08 09:46:13 | 00:07:39 | 1.50 |
01 | 2023-12-17 20:39:29 | 2023-12-17 20:47:18 | 00:07:49 | 5.00 |
02 | 2023-01-17 11:08:27 | 2023-01-17 11:17:41 | 00:09:14 | 5.00 |
02 | 2023-03-17 17:52:45 | 2023-03-17 17:56:11 | 00:03:26 | 1.50 |
02 | 2023-10-11 14:00:17 | 2023-10-11 14:10:19 | 00:10:02 | 5.00 |
Total Cost: 33.00 rubles