Сравнить метод
Либо вы реализуете метод сравнения для вашего объекта:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor (лучше)
или обычно даже лучше:
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];
Вы можете легко сортировать по нескольким ключам, добавив более одного в массив. Использование пользовательских методов сравнения также возможно. Посмотрите на документацию .
Блоки (блестящие!)
Начиная с Mac OS X 10.6 и iOS 4, есть также возможность сортировки по блокам:
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
Представление
-compare:
И блочные методы на основе будет совсем немного быстрее, в общем, чем при использовании в NSSortDescriptor
качестве последнего полагается на КВЦ. Основное преимущество NSSortDescriptor
метода заключается в том, что он предоставляет способ определения порядка сортировки с использованием данных, а не кода, что позволяет, например, легко настроить объекты, чтобы пользователи могли сортировать их NSTableView
, щелкая строку заголовка.
NSMutableArray
я предпочитаю использовать методыsortUsingDescriptors
,sortUsingFunction
илиsortUsingSelector
. Поскольку массив изменчив, мне обычно не нужна отсортированная копия.Смотрите
NSMutableArray
методsortUsingFunction:context:
Вам нужно настроить функцию сравнения, которая принимает два объекта (типа
Person
, поскольку вы сравниваете дваPerson
объекта) и параметр контекста .Два объекта являются просто экземплярами
Person
. Третий объект - это строка, например @ "birthDate".Эта функция возвращает
NSComparisonResult
: Возвращает ,NSOrderedAscending
еслиPersonA.birthDate
<PersonB.birthDate
. Он вернется,NSOrderedDescending
еслиPersonA.birthDate
>PersonB.birthDate
. Наконец, он вернется,NSOrderedSame
еслиPersonA.birthDate
==PersonB.birthDate
.Это грубый псевдокод; вам нужно будет уточнить, что означает, что одна дата «меньше», «больше» или «равна» другой дате (например, сравнение секунд с начала эпохи и т. д.):
Если вы хотите что-то более компактное, вы можете использовать троичные операторы:
Встраивание может, возможно, немного ускорить это, если вы делаете это много.
источник
Я сделал это в iOS 4, используя блок. Пришлось привести элементы моего массива из id к типу моего класса. В данном случае это был класс Score с свойством points.
Также вам нужно решить, что делать, если элементы вашего массива не правильного типа, для этого примера я только что вернулся
NSOrderedSame
, однако в моем коде я исключение.PS: это сортировка по убыванию.
источник
downcasting
не требует приведения перед слабой переменной.return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
Начиная с iOS 4 вы также можете использовать блоки для сортировки.
Для этого конкретного примера я предполагаю, что у объектов в вашем массиве есть метод 'position', который возвращает
NSInteger
.Примечание: «отсортированный» массив будет автоматически освобожден.
источник
Я перепробовал все, но это сработало для меня. В классе у меня есть другой класс с именем "
crimeScene
", и я хочу отсортировать по свойству "crimeScene
".Это работает как шарм:
источник
Во втором ответе Георга Шолли пропущен шаг , но тогда он работает нормально.
// добавил 's', потому что время было потрачено впустую, когда я скопировал и вставил, и это не удалось без 's' в sortedArrayUsingDescriptors
источник
Спасибо работает нормально ...
источник
Ваши
Person
объекты должны реализовать метод, скажем,compare:
который принимает другойPerson
объект, и возвращать вNSComparisonResult
соответствии с отношениями между двумя объектами.Тогда вы позвоните
sortedArrayUsingSelector:
с,@selector(compare:)
и это должно быть сделано.Есть и другие способы, но, насколько я знаю, не существует Cocoa-эквивалента
Comparable
интерфейса. ИспользованиеsortedArrayUsingSelector:
, вероятно, самый безболезненный способ сделать это.источник
Блоки iOS 4 спасут вас :)
http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html немного описания
источник
Для
NSMutableArray
, используйтеsortUsingSelector
метод. Это сортирует это место, не создавая новый экземпляр.источник
sortUsingComparator:
.Вы можете использовать следующий общий метод для ваших целей. Это должно решить вашу проблему.
источник
Если вы просто сортируете массив
NSNumbers
, вы можете отсортировать их одним вызовом:Это работает, потому что объекты в массиве (
NSNumber
объекты) реализуют метод сравнения. Вы можете сделать то же самое дляNSString
объектов или даже для массива пользовательских объектов данных, которые реализуют метод сравнения.Вот пример кода с использованием блоков компаратора. Он сортирует массив словарей, где каждый словарь включает число в ключе «sort_key».
Приведенный выше код проходит через процесс получения целочисленного значения для каждого ключа сортировки и сравнения их, как иллюстрация того, как это сделать. Поскольку
NSNumber
объекты реализуют метод сравнения, его можно переписать гораздо проще:или же тело компаратора может быть перегонено до 1 строки:
Я предпочитаю простые операторы и множество временных переменных, потому что код легче читать и легче отлаживать. Компилятор оптимизирует временные переменные так или иначе, поэтому у версии «все в одной строке» нет никаких преимуществ.
источник
Я создал небольшую библиотеку методов категорий, названную Linq to ObjectiveC , которая упрощает подобные вещи. Используя метод сортировки с ключевым селектором, вы можете сортировать
birthDate
следующим образом:источник
Я только что сделал многоуровневую сортировку на основе пользовательских требований.
// сортируем значения
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
источник
Я использовал sortUsingFunction :: в некоторых моих проектах:
источник
Вы используете NSSortDescriptor для сортировки NSMutableArray с пользовательскими объектами
источник
источник
Сортировка
NSMutableArray
очень проста:источник
Сортировка с использованием NSComparator
Если мы хотим отсортировать пользовательские объекты, нам нужно предоставить данные
NSComparator
, которые используются для сравнения пользовательских объектов. Блок возвращаетNSComparisonResult
значение для обозначения порядка двух объектов. Поэтому для сортировки всего массиваNSComparator
используется следующий способ.Сортировка с использованием NSSortDescriptor
Предположим, в качестве примера, что у нас есть массив, содержащий экземпляры пользовательского класса, у Employee есть атрибуты имя, фамилия и возраст. В следующем примере показано, как создать NSSortDescriptor, который можно использовать для сортировки содержимого массива в возрастающем порядке по ключу возраста.
Сортировка с использованием пользовательских сравнений
Имена - это строки, и при сортировке строк для представления пользователю всегда следует использовать локализованное сравнение. Часто вы также хотите выполнить сравнение без учета регистра. Вот пример с (localizedStandardCompare :), чтобы упорядочить массив по фамилии и имени.
Для справки и подробного обсуждения, пожалуйста, обратитесь: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials / Objective-C / как к своего рода-NSArray-с-пользовательских-объектов /
источник
Протоколы и функциональное программирование Swift делают это очень простым, вам просто нужно привести свой класс в соответствие с протоколом Comparable, реализовать методы, требуемые протоколом, а затем использовать отсортированную (by:) функцию высокого порядка для создания отсортированного массива без необходимости использования изменяемые массивы кстати.
источник
В моем случае я использую «sortedArrayUsingComparator» для сортировки массива. Посмотрите на приведенный ниже код.
Также мой объект,
источник
Вы должны создать sortDescriptor, а затем вы можете отсортировать массив nsmutablearray, используя sortDescriptor, как показано ниже.
источник
Используйте как это для вложенных объектов,
lastRoute - это один объект, и этот объект содержит объект to, этот объект содержит строковые значения lastname.
источник
Сортировать массив в Swift
Для
Swifty
человека ниже очень чистая техника для достижения поставленной цели в глобальном масштабе. Давайте рассмотрим пример пользовательского класса,User
который имеет некоторые атрибуты.Теперь у нас есть массив, который нам нужно отсортировать по
createdDate
возрастанию и / или убыванию. Итак, давайте добавим функцию для сравнения дат.Теперь давайте иметь
extension
вArray
течениеUser
. Проще говоря, давайте добавим некоторые методы только для тех массивов, в которых есть толькоUser
объекты.Использование по возрастанию
Использование по убыванию
Использование для того же заказа
источник
Swift версия: 5.1
Если у вас есть пользовательская структура или класс, и вы хотите отсортировать их произвольно, вам следует вызвать метод sort () с использованием завершающего замыкания, которое сортирует по указанному вами полю. Вот пример использования массива пользовательских структур, который сортирует по определенному свойству:
Если вы хотите вернуть отсортированный массив, а не отсортировать его на месте, используйте sorted () следующим образом:
источник
источник
источник