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