# Student Management Console Application

Консольное 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 | Основная зона ответственности |
|---|---|---|
| **Володин Герман** | — | архитектура приложения, 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
```
