У меня NSArray
есть строка даты (например, NSString) например: «Thu, 21 May 09 19:10:09 -0700»
Мне нужно отсортировать NSArray
по дате. Я NSDate
сначала подумал о преобразовании строки даты в объект, но застрял на том, как сортировать по NSDate
объекту.
Спасибо.
Ответы:
Сохраните даты как
NSDate
объекты в массиве NS (Mutable), затем используйте-[NSArray sortedArrayUsingSelector:
или-[NSMutableArray sortUsingSelector:]
и передайте@selector(compare:)
в качестве параметра.-[NSDate compare:]
Метод заказа даты в возрастающем порядке для вас. Это проще, чем создаватьNSSortDescriptor
, и намного проще, чем писать собственную функцию сравнения. (NSDate
объекты знают, как сравнивать себя друг с другом, по крайней мере настолько эффективно, насколько мы могли надеяться достичь с помощью специального кода.)источник
Если у меня есть несколько
NSMutableArray
объектов с полем типа beginDate,NSDate
я использую,NSSortDescriptor
как показано ниже:NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
источник
-[NSMutableArray sortUsingComparator:]
(10.6+) и передать блок, который возвращает результат вызова-compare:
двух полей. Вероятно, это будет быстрее, чем вызов-valueForKey:
каждого объекта. Вы даже можете использовать-sortWithOptions:usingComparator:
и передавать параметры для одновременной сортировки.Вы также можете использовать что-то вроде следующего:
//Sort the array of items by date [self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){ return [obj2.date compare:obj1.date]; }];
Но это предполагает, что дата хранится
NSDate
скорее как aNString
, что не должно вызывать проблем. Я рекомендую также хранить данные в необработанном формате. Облегчает манипулирование в подобных ситуациях.источник
Вы можете использовать блоки для сортировки на месте:
sortedDatesArray = [[unsortedDatesArray sortedArrayUsingComparator: ^(id a, id b) { NSDate *d1 = [NSDate dateWithString: s1]; NSDate *d2 = [NSDate dateWithString: s2]; return [d1 compare: d2]; }];
Я предлагаю вам преобразовать все ваши строки в даты перед сортировкой, чтобы не выполнять преобразование больше раз, чем есть элементы даты. Любой алгоритм сортировки даст вам больше преобразований строки в дату, чем количество элементов в массиве (иногда значительно больше)
еще немного о сортировке блоков: http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html
источник
В моем случае это сработало следующим образом:
У меня был словарь, где все ключи где даты в формате dd-MM-yyyy. AllKeys возвращает ключи словаря без сортировки, и я хотел представить данные в хронологическом порядке.
источник
Вы можете использовать
sortedArrayUsingFunction:context:
. Вот пример:NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) { NSDate *d1 = [NSDate dateWithString:s1]; NSDate *d2 = [NSDate dateWithString:s2]; return [d1 compare:d2]; } NSArray *sorted = [unsorted sortedArrayUsingFunction:dateSort context:nil];
При
NSMutableArray
использованииsortArrayUsingFunction:context:
вместо него вы можете использовать .источник
NSDate
объекты, вы можете использовать мой ответ выше или даже использовать-[NSMutableArray sortUsingComparator:]
, который был добавлен в 10.6.Когда у вас есть
NSDate
, вы можете создать сNSSortDescriptor
помощью,initWithKey:ascending:
а затем использовать егоsortedArrayUsingDescriptors:
для сортировки.источник
Swift 3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
источник
Изменить это
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
Чтобы
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
Просто поменяйте КЛЮЧ: он должен быть
Date
всегдаисточник