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

5.3 KiB

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

Задача

Дополнить существующий алгоритм сортировки слиянием специальной сортировкой, при которой элементы с чётным значением выбранного числового поля сортируются, а элементы с нечётным значением сохраняют свои исходные позиции.

Контракты

  1. Стратегия должна реализовывать существующий интерфейс SortStrategy<T>.

  2. Стратегия должна работать с MyList<T>.

  3. Алгоритм должен быть основан на сортировке слиянием.

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

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

  6. Числовое поле должно передаваться в стратегию извне в виде функции получения значения:

ToIntFunction<T>
  1. Функция получения числового значения должна:

    • возвращать значение выбранного поля;
    • использоваться для проверки чётности;
    • не содержать дополнительной логики сортировки.
  2. Стратегия не должна самостоятельно выбирать поле через:

    • if;
    • switch;
    • проверку типа Student;
    • прямое обращение к конкретным полям Student.
  3. Для Student доступны функции получения числовых полей:

Student::getGroupNumber
Student::getRecordBookNumber
  1. Поле averageGrade не используется для определения чётности, если оно имеет нецелочисленный тип.

Правила сортировки

  1. Элементы с чётным значением выбранного поля участвуют в сортировке.

  2. Элементы с нечётным значением выбранного поля не перемещаются.

  3. Чётные элементы должны занимать только те позиции, которые до сортировки принадлежали чётным элементам.

  4. Чётные элементы сортируются в натуральном порядке выбранного числового поля.

  5. Нечётные элементы должны остаться на своих исходных позициях.

  6. Количество элементов коллекции не должно изменяться.

Пример

Исходная коллекция:

[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 и компараторами.