Чтобы ответить на ваши подвопросы в комментариях:
Всегда ли сортировка должна выполняться по возрастанию?- NSOrderedAscending
& NSOrderedDescending
здесь просто символичны, вы можете подумать о них как об «объекте перед аргументом» и «объекте после аргумента» в порядке сортировки .Например, если вы храните массив NSNumber
, то «1 compareTo: 2» должен вернуть NSOrderedAscending
, если вы хотите отсортировать по возрастанию значения, и NSOrderedDescending
, если вы хотите отсортировать по убыванию значения.
Как вы сортируете с несколькими ключами?- Любой алгоритм сортировки должен знать только, находится ли один элемент до, после или в той же позиции, что и другой. Как вы определяете, что решать вам.Чтобы использовать два ключа сортировки, в псевдокоде используется следующий алгоритм:
To compare item1 and item2
order = [item1.key1 compareTo:item2.key1];
if (order == NSOrderedSame) order = [item1.key2 compareTo:item2.key2];
return order
Расширение до нескольких ключей или более сложных сравнений по мере необходимости.
Последующие комментарии:
Извините, но предоставленный алгоритм выполняет сортировку по двум ключам, и в общем случае объединение ключей может и не быть расточительным .
В английском языке сортировка поДва ключа выполняются следующим образом: сначала сравнивают первый ключ каждого объекта, если они сравниваются не равные, затем возвращают их порядок.Если они сравниваются равными, то продолжайте и сравнивайте второй ключ каждого объекта и возвращайте их порядок.
Это именно то, что делает приведенный выше псевдокод.
Объединение нескольких клавиш проблематично для числаиз причин:
Вы должны объединить их, используя разделитель, который не может быть в ключах.В качестве простого примера рассмотрим сортировку по заданному имени, фамилии, когда у вас есть два человека «Джек Йоландер» и «Джеки Оландер» - наивное объединение производит «Джеколандер» для обоих, и они будут сортироваться одинаково.Таким образом, вам нужен разделитель, который не может встречаться ни в одной из клавиш.
Если ключи разных типов, например, строка и число, вы в конечном итогепреобразование их всех в строки для объединения - расточительно и, возможно, даже неточно.
Простое объединение их расточительно - вы создаете объекты, которые вам не нужныне нужно.
и т. д.Просто сравнивайте ключи в парах, пока не найдете два отличающихся или попадаете в последнюю пару.Работает с любым количеством ключей любых типов и не расточает.