Консольное Java-приложение для создания, хранения, сортировки, поиска и сохранения коллекций студентов.
Проект разработан командой в рамках учебного задания и демонстрирует применение ООП, собственных коллекций, алгоритмов сортировки, Stream API, паттернов проектирования, CSV-ввода/вывода и unit-тестирования.
---
## Возможности
Приложение позволяет:
- создавать коллекции студентов вручную;
- генерировать случайные данные;
- загружать студентов из CSV-файла;
- просматривать текущую коллекцию;
- сохранять коллекцию в CSV;
- сортировать студентов по номеру группы, среднему баллу и номеру зачётной книжки;
- выбирать алгоритм сортировки;
- выполнять специальную even-only сортировку;
- искать студентов по нескольким критериям;
- объединять критерии поиска через `И` / `ИЛИ`;
- подсчитывать количество вхождений студента;
- получать индексы найденных элементов.
---
## Архитектура
Основной поток данных:
```text
Manual / CSV / Random
↓
Student
↓
MyList<Student>
↓
┌─────┴─────┐
↓ ↓
Sorting Search
│ │
└─────┬─────┘
↓
Console / CSV
```
Логика приложения разделена на отдельные функциональные области: модель данных, создание коллекции, хранение, сортировка, поиск, CSV-ввод/вывод и пользовательский интерфейс.
---
## Основные компоненты
### Student
`Student` — основная модель данных приложения.
Модель содержит данные студента, выполняет валидацию входных значений и определяет правила сравнения объектов через `equals()` и `hashCode()`.
Для пошагового создания объектов используется `StudentBuilder`.
### Custom Collection
Для хранения студентов используются собственные:
-`MyList<T>`;
-`MyLinkedList<T>`.
Коллекция поддерживает основные операции работы с данными и интеграцию со Stream API.
Для сбора результатов Stream обратно в `MyList` реализован собственный `MyListCollector`.
### Sorting
Система сортировки построена на паттерне **Strategy**.
Доступны:
- Merge Sort;
- Bubble Sort;
- even-only sorting.
`SortStrategy` определяет алгоритм сортировки, а `Comparator<Student>` — поле, по которому сравниваются студенты.
```text
SortStrategy
↓
КАК сортировать
Comparator
↓
ПО КАКОМУ ПОЛЮ сортировать
```
### Search
Поиск поддерживает несколько критериев:
- номер группы;
- средний балл;
- номер зачётной книжки.
Несколько условий могут объединяться через `И` / `ИЛИ`.
Для составных условий используется паттерн **Composite**.
Также реализован поиск количества вхождений студента и индексов найденных элементов.
### CSV
За работу с CSV отвечают:
-`StudentCsvReader`;
-`StudentCsvWriter`.
Загрузка данных:
```text
CSV
↓
StudentCsvReader
↓
Student
↓
MyList<Student>
```
Сохранение:
```text
MyList<Student>
↓
StudentCsvWriter
↓
CSV
```
### Создание коллекции
Поддерживаются разные способы заполнения коллекции:
- ручной ввод;
- случайная генерация;
- загрузка из файла.
Для этого используются отдельные стратегии заполнения.
---
## Использованные паттерны и подходы
| Паттерн / подход | Использование |
|---|---|
| Builder | создание объектов `Student` |
| Strategy | выбор алгоритма сортировки и способа заполнения коллекции |
| Composite | объединение критериев поиска |
| Custom Collector | преобразование Stream в `MyList` |
---
## Технологии
- Java 21
- Maven
- JUnit 5
- Apache Commons CSV
- Java Stream API
- Git
- GitHub
---
## Команда
| Участник | GitHub | Основная зона ответственности |
> Компоненты проекта разрабатывались параллельно и в ходе интеграции дорабатывались несколькими участниками. В таблице указаны основные зоны ответственности.
---
## Тестирование
Основные компоненты проекта покрыты unit-тестами с использованием **JUnit 5**.