# Техническое задание: сортировка по чётным значениям ## Задача Дополнить существующий алгоритм сортировки слиянием специальной сортировкой, при которой элементы с чётным значением выбранного числового поля сортируются, а элементы с нечётным значением сохраняют свои исходные позиции. ## Контракты 1. Стратегия должна реализовывать существующий интерфейс `SortStrategy`. 2. Стратегия должна работать с `MyList`. 3. Алгоритм должен быть основан на сортировке слиянием. 4. Готовые методы сортировки Java использовать запрещено. 5. Стратегия не должна зависеть непосредственно от класса `Student`. 6. Числовое поле должно передаваться в стратегию извне в виде функции получения значения: ```java ToIntFunction ``` 1. Функция получения числового значения должна: - возвращать значение выбранного поля; - использоваться для проверки чётности; - не содержать дополнительной логики сортировки. 2. Стратегия не должна самостоятельно выбирать поле через: - `if`; - `switch`; - проверку типа `Student`; - прямое обращение к конкретным полям `Student`. 3. Для `Student` доступны функции получения числовых полей: ```java Student::getGroupNumber Student::getRecordBookNumber ``` 1. Поле `averageGrade` не используется для определения чётности, если оно имеет нецелочисленный тип. ## Правила сортировки 1. Элементы с чётным значением выбранного поля участвуют в сортировке. 2. Элементы с нечётным значением выбранного поля не перемещаются. 3. Чётные элементы должны занимать только те позиции, которые до сортировки принадлежали чётным элементам. 4. Чётные элементы сортируются в натуральном порядке выбранного числового поля. 5. Нечётные элементы должны остаться на своих исходных позициях. 6. Количество элементов коллекции не должно изменяться. ### Пример Исходная коллекция: ```text [3, 8, 5, 2, 4, 7] ``` Результат: ```text [3, 2, 5, 4, 8, 7] ``` Нечётные значения `3`, `5`, `7` остались на исходных позициях. Чётные значения `8`, `2`, `4` были отсортированы по возрастанию и заняли позиции, которые изначально принадлежали чётным элементам. ## Примеры тестов ### Тест сортировки по номеру группы Использовать `Student::getGroupNumber`: ```java MyList students = ...; SortStrategy strategy = new EvenOnlyMergeSortStrategy<>(Student::getGroupNumber); strategy.sort(students, new StudentGroupComparator()); ``` Проверить, что: - студенты с нечётным номером группы остались на исходных позициях; - студенты с чётным номером группы отсортированы по возрастанию; - количество элементов не изменилось. ### Тест сортировки по номеру зачётной книжки Использовать `Student::getRecordBookNumber`. Проверить те же условия для номера зачётной книжки. ### Тест без чётных элементов Исходные значения: ```text [1, 3, 5, 7] ``` Результат должен быть идентичен исходной коллекции. ### Тест без нечётных элементов Исходные значения: ```text [8, 2, 6, 4] ``` Результат: ```text [2, 4, 6, 8] ``` ### Тест с одним элементом Исходные значения: ```text [4] ``` Результат: ```text [4] ``` ### Тест с пустой коллекцией Сортировка пустой коллекции не должна приводить к ошибке. ## Результат Реализовать: ```text EvenOnlyMergeSortStrategy.java ``` Класс должен принимать `ToIntFunction` через конструктор и работать с существующими `MyList`, `SortStrategy` и компараторами.