NSArray сортировки дат

Рассмотрим этот массив. У него нет ключей, поэтому я не уверен, что смогу использовать NSSortDescriptor. Как лучше их отсортировать?

(
    "Thursday, July 30, 2009",
    "Monday, September 07, 2009",
    "Wednesday, September 09, 2009",
    "Friday, August 14, 2009",
    "Saturday, September 05, 2009",
    "Monday, August 10, 2009",
    "Thursday, July 23, 2009",
    "Monday, October 12, 2009",
    "Friday, October 16, 2009",
    "Monday, August 17, 2009",
    "Tuesday, October 13, 2009",
    "Wednesday, September 30, 2009",
    "Sunday, August 16, 2009",
    "Thursday, August 27, 2009",
    "Monday, August 31, 2009",
    "Saturday, August 15, 2009",
    "Thursday, August 06, 2009",
    "Saturday, September 26, 2009",
    "Tuesday, September 29, 2009",
    "Tuesday, September 15, 2009",
    "Tuesday, September 01, 2009"
)

person Chris Van Buskirk    schedule 23.10.2009    source источник


Ответы (2)


Вы можете использовать sortedArrayUsingFunction:

Вот пример кода.

NSInteger dateSort(id s1, id s2, void *context)
{
    NSDateFormatter* format = (NSDateFormatter*)context;
    NSDate* d1 = [format dateFromString:s1];
    NSDate* d2 = [format dateFromString:s2];

    return [d1 compare:d2];
}

...

-(void)someObjectiveCMethod
{
    NSDateFormatter* format = [[[NSDateFormatter alloc] init] autorelease];

    // Find theses format codes here:
    // http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns
    //
    [format setDateFormat:@"EEEE, MMMM dd, yyyy"];

    NSArray* myArray = getMyArray();
    NSArray* sortedArray = [myArray sortedArrayUsingFunction:dateSort context:format];
}

Существует количество таких методов сортировки в NSArray. Стоит посмотреть на них, чтобы ознакомиться с ними.

person nall    schedule 23.10.2009
comment
Хм... на самом деле это не отсортировало список. Будет копать с ним. - person Chris Van Buskirk; 23.10.2009
comment
Ради эффективности я бы посоветовал создать NSDateFormatter в someObjectiveCMethod и передать его в качестве параметра контекста. Или, по крайней мере, не использовать autorelease в dateSort. - person Sixten Otto; 23.10.2009
comment
Я также изменил форматирование через контекст. Я просто пытался быть откровенным, но Сикстен прав. У вас не было бы этого в реальном коде. - person nall; 23.10.2009
comment
Идеально! Спасибо за помощь! - person Chris Van Buskirk; 23.10.2009

person    schedule
comment
О, у меня сложилось впечатление, что в массиве были NSStrings, а не NSDates. Если у него есть NSDates, ответ Дейва правильный (меньше кода — хорошо). - person nall; 23.10.2009
comment
О, эй, я даже не думал, что это могут быть струны. Я просто предположил, что массив объектов, выглядящих как даты, будет датами, потому что было бы довольно безумно хранить даты каким-либо другим способом. - person Dave DeLong; 23.10.2009
comment
Да, извините, это строки, а не nsdates. - person Chris Van Buskirk; 23.10.2009
comment
Я бы отредактировал заголовок и/или содержание, чтобы сделать это более очевидным. :) - person Wevah; 24.10.2009
comment
Я бы предложил сделать их даты. Хорошо хранить код анализа даты и код сортировки даты (отдельные задачи) в разных местах. - person Peter Hosey; 24.10.2009