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