При разделении изменяемой коллекции предикатом что означает возвращённый индекс?
Возвращённый индекс указывает на границу двух частей: начиная с него находятся элементы, для которых предикат вернул true, а перед ним — элементы, для которых предикат вернул false. Порядок элементов внутри обеих частей не гарантируется.
partition(by:) относится к алгоритмам разделения коллекций без создания второй коллекции. Такой подход нужен, когда важно уменьшить дополнительные аллокации и изменить существующий изменяемый контейнер на месте.
Это более низкоуровневая операция, чем filter: filter создаёт новый массив выбранных элементов, а partition(by:) только переставляет элементы исходной изменяемой коллекции и возвращает позицию раздела.
После разделения нельзя трактовать возвращённый индекс как количество элементов, удовлетворяющих условию, если индексами коллекции нельзя безопасно оперировать как целыми числами. Это именно Index коллекции, а не универсальное числовое смещение.
Нельзя также рассчитывать на сохранение исходного порядка. Если алгоритму нужна стабильная последовательность элементов, partition(by:) может привести к ошибочному результату даже при корректном разделении на две группы.
Предикат определяет, в какую часть должен попасть каждый элемент. После завершения операции выполняется инвариант: любой элемент до возвращённого индекса не удовлетворяет предикату, а любой элемент начиная с этого индекса удовлетворяет ему.
В примере boundary можно использовать для получения двух срезов. Конкретный порядок нечётных элементов в первой части и чётных во второй не является контрактом операции.
Метод требует изменяемую коллекцию, потому что он переставляет её элементы. В отличие от filter, результатом является не новая коллекция, а индекс границы; это экономит память, но делает исходные данные изменёнными.
Нужно отделить активные записи от неактивных в большом массиве перед дальнейшей обработкой. Вариант с filter прост и сохраняет порядок, но создаёт новый массив и требует дополнительной памяти. Вариант с ручным обменом элементов экономичен, но сложнее и легче приводит к ошибкам с индексами.
partition(by:) подходит, если порядок записей не важен: он изменяет массив на месте, возвращает границу и позволяет обрабатывать две части независимо. Если же пользовательский интерфейс или отчёт требуют исходного порядка, лучше выбрать filter или стабильное разделение с явным сохранением порядка.
Нет, не в общем случае. Индекс коллекции не обязан быть целым числом, начинаться с нуля или совпадать с количеством элементов до него. Для получения числа элементов следует использовать расстояние от startIndex до границы, учитывая стоимость этой операции для конкретного типа коллекции.
Нет. Метод гарантирует принадлежность элементов соответствующей части, но не взаимный порядок элементов внутри частей. Поэтому он не заменяет стабильную фильтрацию, когда порядок исходных данных имеет смысл.
Если предикат всегда возвращает false, вся коллекция окажется в первой части, а граница будет равна endIndex. Если он всегда возвращает true, первая часть будет пустой, а граница совпадёт с startIndex. Это корректные результаты, а не особые ошибки или исключения.