# Student Management Console Application Консольное Java-приложение для создания, хранения, сортировки, поиска и сохранения коллекций студентов. Проект разработан командой в рамках учебного задания и демонстрирует применение ООП, собственных коллекций, алгоритмов сортировки, Stream API, паттернов проектирования, CSV-ввода/вывода и unit-тестирования. --- ## Возможности Приложение позволяет: - создавать коллекции студентов вручную; - генерировать случайные данные; - загружать студентов из CSV-файла; - просматривать текущую коллекцию; - сохранять коллекцию в CSV; - сортировать студентов по номеру группы, среднему баллу и номеру зачётной книжки; - выбирать алгоритм сортировки; - выполнять специальную even-only сортировку; - искать студентов по нескольким критериям; - объединять критерии поиска через `И` / `ИЛИ`; - подсчитывать количество вхождений студента; - получать индексы найденных элементов. --- ## Архитектура Основной поток данных: ```text Manual / CSV / Random ↓ Student ↓ MyList ↓ ┌─────┴─────┐ ↓ ↓ Sorting Search │ │ └─────┬─────┘ ↓ Console / CSV ``` Логика приложения разделена на отдельные функциональные области: модель данных, создание коллекции, хранение, сортировка, поиск, CSV-ввод/вывод и пользовательский интерфейс. --- ## Основные компоненты ### Student `Student` — основная модель данных приложения. Модель содержит данные студента, выполняет валидацию входных значений и определяет правила сравнения объектов через `equals()` и `hashCode()`. Для пошагового создания объектов используется `StudentBuilder`. ### Custom Collection Для хранения студентов используются собственные: - `MyList`; - `MyLinkedList`. Коллекция поддерживает основные операции работы с данными и интеграцию со Stream API. Для сбора результатов Stream обратно в `MyList` реализован собственный `MyListCollector`. ### Sorting Система сортировки построена на паттерне **Strategy**. Доступны: - Merge Sort; - Bubble Sort; - even-only sorting. `SortStrategy` определяет алгоритм сортировки, а `Comparator` — поле, по которому сравниваются студенты. ```text SortStrategy ↓ КАК сортировать Comparator ↓ ПО КАКОМУ ПОЛЮ сортировать ``` ### Search Поиск поддерживает несколько критериев: - номер группы; - средний балл; - номер зачётной книжки. Несколько условий могут объединяться через `И` / `ИЛИ`. Для составных условий используется паттерн **Composite**. Также реализован поиск количества вхождений студента и индексов найденных элементов. ### CSV За работу с CSV отвечают: - `StudentCsvReader`; - `StudentCsvWriter`. Загрузка данных: ```text CSV ↓ StudentCsvReader ↓ Student ↓ MyList ``` Сохранение: ```text MyList ↓ StudentCsvWriter ↓ CSV ``` ### Создание коллекции Поддерживаются разные способы заполнения коллекции: - ручной ввод; - случайная генерация; - загрузка из файла. Для этого используются отдельные стратегии заполнения. --- ## Использованные паттерны и подходы | Паттерн / подход | Использование | |---|---| | Builder | создание объектов `Student` | | Strategy | выбор алгоритма сортировки и способа заполнения коллекции | | Composite | объединение критериев поиска | | Custom Collector | преобразование Stream в `MyList` | --- ## Технологии - Java 21 - Maven - JUnit 5 - Apache Commons CSV - Java Stream API - Git - GitHub --- ## Команда | Участник | GitHub | Основная зона ответственности | |---|---|---| | **Володин Герман** | — | архитектура приложения, Console UI, интеграция компонентов | | **Артющик Анастасия** | `AnastasiArchi` | `Student`, `StudentBuilder`, even-only sorting | | **Дюрягин Данил** | — | сортировка, `Comparator`, Composite Search | | **Гаджикурбанов Темирлан** | `t1-f` | собственная коллекция, Collector, Random Generator, поиск вхождений | | **Ершов Владислав** | `Vladislav-E-N` | CSV Reader/Writer, DataSource, обработка файлов | > Компоненты проекта разрабатывались параллельно и в ходе интеграции дорабатывались несколькими участниками. В таблице указаны основные зоны ответственности. --- ## Тестирование Основные компоненты проекта покрыты unit-тестами с использованием **JUnit 5**. Проверяются: - модель `Student` и валидация; - `equals()` / `hashCode()`; - алгоритмы сортировки; - even-only sorting; - собственная коллекция; - Custom Collector; - поиск; - генерация данных; - CSV Reader/Writer. --- ## Документация ### Задания и компоненты - [Общее задание](TASK.ru.md) - [Student](docs/tasks/Student.md) - [Обновление Student](docs/tasks/StudentUpdate.md) - [Собственная коллекция](docs/tasks/CustomList.md) - [Сортировка](docs/tasks/Sorting.md) - [Even-only sorting](docs/tasks/EvenOnlySortStrategy.md) - [Composite Search](docs/tasks/CompositeStudentSearch.md) - [Поиск вхождений](docs/tasks/StudentOccurrenceIndexFinder.md) - [CSV Reader / Writer](docs/tasks/CsvStudentIO.md) - [Stream и собственная коллекция](docs/tasks/StreamCollection.md) - [Тестирование](docs/tasks/Testing.md) ### Git и командная разработка - [Правила создания коммитов](CONTRIBUTING.ru.md) - [Работа с зависимостями между ветками](GIT_BRANCH_DEPENDENCIES.ru.md) - [Настройка Git](GIT_CONFIG.ru.md) - [Восстановление после force-with-lease](GIT_FORCE_WITH_LEASE_RECOVERY.ru.md) --- ## Запуск `pom.xml` находится в директории `app`. Перейдите в директорию приложения: ```bash cd app ``` Соберите проект: ```bash mvn clean package ``` Запустите собранное приложение: ```bash java -jar target/app-1.0-SNAPSHOT.jar ``` Основной класс приложения: ```text ru.project.App ``` ### Особенности сборки и запуска приложения под Windows В `pom.xml` добавить: ```xml ``` Соберите проект: ```bash mvn clean package ``` Запустите собранное приложение: ```bash javaw -jar target/app-1.0-SNAPSHOT.jar ```