Как отсортировать массив, содержащий даты в iphone SDK

У меня есть массив, который содержит строки даты, такие как

"15.09.2011, 12:00:00", "15.10.2011, 12:00:00", "16.11.2011, 12:00:00"

Как я могу отсортировать этот массив в порядке убывания? Порядок должен быть отсортирован сначала по году, затем по месяцу, затем по дате, а затем по времени.

Пожалуйста, поделитесь своими идеями. Спасибо

5 ответов

Решение

Сортировка NSDates, пока они в формате NSString, практически невозможна, за исключением случаев, когда они имеют формат "YYYYMMddHHmmss", который можно сортировать как строки сортировки. См. Ответ @Daniel R Hicks.

Преобразуйте строку в NSDate, пока вы анализируете и добавляете даты из веб-службы.

NSString *dateStr = ...
NSDateFormatter *df = ;[NSDateFormatter alloc] init];
[df setDateFormat:@"M/dd/YYYY hh:mm:ss a"];

[datesArray addObject:[df dateFromString:dateStr]];

И сортировка,

[datesArray sortUsingSelector:@selector(compare:)];

И оригинальный ответ здесь!

Попробуйте приведенный ниже код. это даст дату сортировки в порядке возрастания.

NSMutableArray *arraydate=[[NSMutableArray alloc] init];
[arraydate addObject:@"22/7/2010"];
[arraydate addObject:@"1/1/1988"];

[arraydate addObject:@"22/7/1966"];

[arraydate addObject:@"22/7/2000"];

[arraydate addObject:@"1/7/2010"];

[arraydate sortUsingSelector:@selector(compare:)];

NSLog(@"array=%@",[arraydate description]);

Если они уже являются строками, вы можете либо преобразовать их в NSDates (и, следовательно, в NSTimeIntervals) и отсортировать их, либо эффективно переставить цифры в YYMMDDHHmmss, где HH был преобразован в представление 00-23.

Либо можно сделать с помощью вызова sortUsingFunction.

Есть метод для сравнения двух дат.

 int interval = [date1 compare:date2];

        if (interval == 1)
        {
            NSLog(@"Right hand side date is earlier");
        }
        else if (interval == -1)
        {
            NSLog(@"Left hand side date is earlier");
        }

        else 
        {
            NSLog(@"Both Dates are equal");
        }

Вы можете использовать этот метод, но убедитесь, что ваши date1 и date2 являются объектами NSDate, и после их сравнения вы можете использовать метод пузырьковой сортировки вместе с ним для сортировки массива.

static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |NSWidthInsensitiveSearch | NSForcedOrderingSearch;

    NSLocale *currentLocale = [NSLocale currentLocale];

    NSArray *sortArray = [iArray sortedArrayUsingComparator:^(id string1, id string2) {

        NSRange string1Range = NSMakeRange(0, [string1 length]);

        //if([string2 isEqualToString:@"#"])
            //return -1;

        return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
    }];

    return sortArray;
Другие вопросы по тегам