Сортировка NSMutableArray содержит NSArray с использованием sortedArrayUsingComparator

У меня проблема с сортировкой массива nsdate. так что у меня есть массив дат внутри nsmutablearray

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSArray *arrString = [[NSArray alloc] initWithObjects:@"2012-05-01", @"2012-02-01", @"2012-22-03", @"2012-05-01", @"2012-15-01", nil];
NSMutableArray *arrDate = [[NSMutableArray alloc] initWithCapacity:arrString.count];
for (NSString *item in arrString) {
    NSDate *date = [dateFormatter dateFromString:item];
    [arrDate addObject:date];
}

как я видел во многих случаях, они используют такой код для сортировки массива:

NSArray *sortedArray = [arrDate sortedArrayUsingComparator:^(id firstObject, id secondObject) {
    return [((NSDate *)firstObject) compare:((NSDate *)secondObject)];
}];

Я пытался поставить свой массив на нем, но не сработало. Любой может помочь мне, как на самом деле лучший способ сортировки nsmutablearray содержат nsdate. Я хочу поставить самую последнюю дату в верхней части массива индекса.

Таким образом, реальный вопрос, как я могу отсортировать данные внутри arrDate?

Спасибо.

1 ответ

Решение

Ваш формат даты не соответствует строкам даты, которые вы используете.

yyyy-MM-dd hh:mm:ss

означает, что даты, которые вы указываете, должны выглядеть примерно так:

2012-05-09 15:54:21
        ^^ Day
     ^^ Month

т. е. в ваших строках отсутствуют часы, минуты и секунды, и у вас есть некоторые даты с 22 и 15 месяцами. Если средство форматирования даты не может проанализировать дату, я думаю, что она возвращает ноль, что означает, что вы пытаетесь поместить ноль в массив, который вызовет исключение.

редактировать

Чтобы на самом деле отсортировать даты, ваш пример кода выглядит нормально, за исключением того, что вы хотите сначала самую последнюю, поэтому поменяйте compare:

NSArray *sortedArray = [arrDate sortedArrayUsingComparator:^(id firstObject, id secondObject) {
     return [secondObject compare: firstObject];
}];   

Или с изменяемым массивом, вы можете отсортировать на месте:

[arrDate sortUsingComparator:^(id firstObject, id secondObject) {
     return [secondObject compare: firstObject];
}];    
Другие вопросы по тегам