# Техническое задание: сортировка по чётным значениям ## Задача Дополнить существующую сортировку слиянием специальной стратегией `EvenOnlyMergeSortStrategy`. Стратегия должна сортировать только объекты, у которых выбранное числовое поле имеет чётное значение. Объекты с нечётным значением должны сохранять свои исходные позиции. ## Контракты 1. Стратегия должна реализовывать существующий интерфейс: ```java SortStrategy ``` 1. Метод сортировки должен работать с: ```java MyList ``` 1. Для сортировки чётных элементов использовать алгоритм **Merge Sort**. 2. Готовые методы сортировки Java использовать запрещено. 3. Стратегия не должна зависеть непосредственно от класса `Student`. 4. Числовое поле передавать в стратегию извне через: ```java ToIntFunction ``` 1. Сохранить переданный `ToIntFunction` во внутреннем поле стратегии. 2. Для определения чётности элемента использовать: ```java valueExtractor.applyAsInt(element) ``` 1. `ToIntFunction` используется только для получения числового значения выбранного поля. Стратегия не должна знать, какое именно поле объекта используется. 2. Для `Student` в качестве числового поля используется: ```java Student::getRecordBookNumber ``` 1. `getRecordBookNumber()` должен возвращать `int`. ## Правила алгоритма Стратегия должна: 1. Пройти по исходной `MyList`. 2. Определить элементы с чётным значением, используя `ToIntFunction`. 3. Запомнить позиции этих элементов. 4. Отдельно отсортировать только чётные элементы с помощью **Merge Sort** и переданного `Comparator`. 5. Вернуть отсортированные чётные элементы на позиции, которые занимали чётные элементы до сортировки. 6. Не изменять позиции элементов с нечётным значением. 7. Не изменять размер коллекции. ### Пример Исходные значения выбранного числового поля: ```text [7, 8, 3, 2, 5, 4] ``` Чётные элементы: ```text 8, 2, 4 ``` После Merge Sort: ```text 2, 4, 8 ``` Результат: ```text [7, 2, 3, 4, 5, 8] ``` Нечётные элементы `7`, `3`, `5` остались на исходных позициях. ## Пример использования ```java SortStrategy strategy = new EvenOnlyMergeSortStrategy<>( Student::getRecordBookNumber ); strategy.sort( students, new StudentRecordBookComparator() ); ``` Стратегия получает функцию выбора числового поля извне и не содержит логики, специфичной для `Student`. ## Примеры тестов ### Обычный случай Создать студентов с `recordBookNumber`: ```text 7, 8, 3, 2, 5, 4 ``` После сортировки ожидается: ```text 7, 2, 3, 4, 5, 8 ``` Проверить: - нечётные элементы сохранили свои позиции; - чётные элементы отсортированы по возрастанию; - количество элементов не изменилось. ### Все значения нечётные ```text 1, 3, 5, 7 ``` Ожидаемый результат: ```text 1, 3, 5, 7 ``` ### Все значения чётные ```text 8, 2, 6, 4 ``` Ожидаемый результат: ```text 2, 4, 6, 8 ``` ### Один элемент ```text 4 ``` Ожидаемый результат: ```text 4 ``` ### Пустая коллекция Пустая коллекция должна остаться пустой и не приводить к ошибке. ### Проверка `ToIntFunction` Передать: ```java Student::getRecordBookNumber ``` и проверить, что именно `recordBookNumber` используется для определения чётности. ## Ограничения Запрещено: - использовать `Arrays.sort()`, `Collections.sort()`, `List.sort()` и другие готовые алгоритмы сортировки; - перемещать элементы с нечётным значением; - использовать отдельный алгоритм сортировки вместо Merge Sort; - напрямую обращаться к полям `Student` внутри `EvenOnlyMergeSortStrategy`; - выбирать поле через `if` или `switch`; - использовать стандартные коллекции Java в качестве основной коллекции. ## Результат Реализовать: ```text EvenOnlyMergeSortStrategy.java ``` Класс должен использовать: ```text SortStrategy.java MyList.java ToIntFunction Comparator ``` и не должен иметь зависимости от конкретного класса `Student`.