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