Files
aston-team-project/docs/tasks/EvenOnlyMergeSort.md
T

5.8 KiB

Техническое задание: сортировка по чётным значениям

Задача

Дополнить существующую сортировку слиянием специальной стратегией EvenOnlyMergeSortStrategy.

Стратегия должна сортировать только объекты, у которых выбранное числовое поле имеет чётное значение. Объекты с нечётным значением должны сохранять свои исходные позиции.

Контракты

  1. Стратегия должна реализовывать существующий интерфейс:
SortStrategy<T>
  1. Метод сортировки должен работать с:
MyList<T>
  1. Для сортировки чётных элементов использовать алгоритм Merge Sort.

  2. Готовые методы сортировки Java использовать запрещено.

  3. Стратегия не должна зависеть непосредственно от класса Student.

  4. Числовое поле передавать в стратегию извне через:

ToIntFunction<T>
  1. Сохранить переданный ToIntFunction<T> во внутреннем поле стратегии.

  2. Для определения чётности элемента использовать:

valueExtractor.applyAsInt(element)
  1. ToIntFunction<T> используется только для получения числового значения выбранного поля. Стратегия не должна знать, какое именно поле объекта используется.

  2. Для Student в качестве числового поля используется:

Student::getRecordBookNumber
  1. getRecordBookNumber() должен возвращать int.

Правила алгоритма

Стратегия должна:

  1. Пройти по исходной MyList<T>.
  2. Определить элементы с чётным значением, используя ToIntFunction<T>.
  3. Запомнить позиции этих элементов.
  4. Отдельно отсортировать только чётные элементы с помощью Merge Sort и переданного Comparator<T>.
  5. Вернуть отсортированные чётные элементы на позиции, которые занимали чётные элементы до сортировки.
  6. Не изменять позиции элементов с нечётным значением.
  7. Не изменять размер коллекции.

Пример

Исходные значения выбранного числового поля:

[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.