Вопрос

У меня есть NSArray который содержит строки даты (т.е.NSString) вот так:"Чт, 21 мая, 09 19:10:09 -0700"

Мне нужно разобраться с NSArray по дате.Я подумал о преобразовании строки даты в NSDate сначала возразил, но застрял на том, как сортировать по NSDate объект.

Спасибо.

Это было полезно?

Решение

Храните даты в виде NSDate объекты в NS (изменяемом) массиве, затем используйте -[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];

Вы также можете использовать что-то вроде следующего:

//Sort the array of items by  date
    [self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
        return [obj2.date compare:obj1.date];
    }];

Но это предполагает, что дата хранится как NSDate скорее NString, что не составит труда сделать/сделать.Предпочтительно я рекомендую также хранить данные в необработанном формате.Облегчает манипулирование в подобных ситуациях.

Вы можете использовать блоки для сортировки на месте:

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

В моем случае это сработало следующим образом:

    NSArray *aUnsorted = [dataToDb allKeys];
    NSArray *arrKeys = [aUnsorted sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"dd-MM-yyyy"];
        NSDate *d1 = [df dateFromString:(NSString*) obj1];
        NSDate *d2 = [df dateFromString:(NSString*) obj2];
        return [d1 compare: d2];
    }];

У меня был словарь, где все ключи содержали даты в формате дд-ММ-гггг.А 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, вы можете создать NSSortDescriptor с initWithKey:ascending: а затем использовать sortedArrayUsingDescriptors: сделать сортировку.

Изменить это

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 всегда

Свифт 3.0

myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top