2013-06-04 11 views
2

У меня есть даты в массиве, как показано ниже, и я хочу его отсортировать.Как отсортировать массив дат?

NSMutableArray *arrDates =[[NSMutableArray alloc]init]; 
[arrDates addObject:@"24/01/2010"]; 
[arrDates addObject:@"15/05/2014"]; 
[arrDates addObject:@"04/03/2011"]; 
[arrDates addObject:@"30/05/2013"]; 
[arrDates addObject:@"11/10/2012"]; 

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

NSSortDescriptor *sortDis = [[NSSortDescriptor alloc] initWithKey:????? ascending:TRUE]; 
[arr sortUsingDescriptors:[NSArray arrayWithObject:sortDis]]; 

Я прошел самого но его сортировка только на основании даты (день).

Я хочу, чтобы отобразить результат, как показано ниже

24/01/2010 
04/03/2011 
11/10/2012 
30/05/2013 
15/05/2014 

, а также я попытался с ниже линии

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

, но не используется. Пожалуйста помоги.

+2

Это не даты. сначала преобразуйте строки в даты. – Wain

+1

как для (NSString * strDate in arrDates) { NSDateFormatter * formatter = [NSDateFormatter new]; [formatter setDateFormat: @ "dd/MM/yyyy"]; NSDate * date = [formatter dateFromString: strDate]; [arr addObject: date]; } –

ответ

7

Храните данные, используя соответствующий тип, который для дат NSDate, а затем вы можете использовать:

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) { 
    return [date1 compare:date2]; 
}]; 

Что предполагает array является NSArray из NSDate объектов.

+0

+1 Самый эффективный ответ :) – HAS

+0

Также он имеет несколько строк кода. –

+0

+1 @trojanfoe, это лучший ответ. Если у меня есть 100 obj, то это замедлит это условие? –

4

Попробуйте

NSMutableArray *arrDates =[[NSMutableArray alloc]init]; 
[arrDates addObject:@"24/01/2010"]; 
[arrDates addObject:@"15/05/2014"]; 
[arrDates addObject:@"04/03/2011"]; 
[arrDates addObject:@"30/05/2013"]; 
[arrDates addObject:@"11/10/2012"]; 

NSDateFormatter *dateFormatter = [NSDateFormatter new]; 
[dateFormatter setDateFormat:@"dd/MM/yyyy"]; 
[arrDates sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSDate *date1 = [dateFormatter dateFromString:obj1]; 
    NSDate *date2 = [dateFormatter dateFromString:obj2]; 
    return [date1 compare:date2]; 
}]; 
+1

Много конверсий происходит там, что не может быть эффективным. Что случилось с преобразованием строк в даты до этого? Это, без сомнения, будет полезно, когда массив должен быть представлен или обработан. – trojanfoe

+1

@trojanfoe Я только что предложил решение, соответствующее требованию. Если я могу, я никогда не буду хранить dateString как таковой, а как экземпляры NSDate. Спасибо за ваше предложение. – Anupdas

+0

это правильный ответ –

1

Вы должны добавить их в качестве объектов NSDate, для этого использовать этот:

NSString *dateString = @"01/02/2010"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"dd-MM-yyyy"]; 
NSDate *dateFromString = [[NSDate alloc] init]; 
dateFromString = [dateFormatter dateFromString:dateString]; 
[dateFormatter release]; 

После того, как массив содержит NSDates, он будет отсортирован правильно

Или если вы не хотите хранить NSDates, когда вы его сравниваете, конвертируйте их в дате и сравнивайте их.

0

Магазин даты как NSDate объектов в NS (измененными) Массив, а затем использовать [NSArray sortedArrayUsingSelector: или [NSMutableArray sortUsingSelector: и передать @selector (сравни :) в качестве параметра. - [NSDate compare:] метод будет заказывать даты в порядке возрастания.

Смежные вопросы