2015-06-05 5 views
-1

Я пытаюсь найти лучший/самый эффективный способ сортировки массива, который содержит n-число словарей. Одна из пар ключ/значение в каждом словаре - это поле даты. После добавления всех словарей в массив, я хотел бы отсортировать массив по убыванию даты.Сортировка NSMutableArray, который содержит NSMutableDictionaries

Например, у меня есть такой код:

NSMutableArray *myArray = [[NSMutableArray alloc] init]; 

NSMutableDictionary *dictionary1 = [[NSMutableDictionary alloc] init]; 
    NSDate *today = [NSDate date]; 
    [dictionary1 setObject:today forKey:@"date"]; 
    [dictionary1 setObject:@"Another value" forKey:@"anotherKey"]; 

[myArray addObject:dictionary1]; 

NSMutableDictionary *dictionary2 = [[NSMutableDictionary alloc] init]; 
    NSDate *tomorrow = [[NSDate date] dateByAddingTimeInterval:60*60*24]; 
    [dictionary2 setObject:tomorrow forKey:@"date"]; 
    [dictionary2 setObject:@"Yet another value" forKey:@"anotherKey"]; 

[myArray addObject:dictionary2]; 

Теперь мне нужно туАггау быть отсортированы по дате по убыванию. (индекс массива 0 должен быть последней датой)

Примечание: В моем фактическом проекте я не создаю и не добавляю словари таким образом. Но, например, для того, чтобы увидеть, как дата хранится в словаре, допустим, я поместил эти два в массив.

ответ

3

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

NSMutableArray *myArray = [[NSMutableArray alloc] init]; 

NSMutableDictionary *dictionary1 = [[NSMutableDictionary alloc] init]; 
NSDate *today = [NSDate date]; 
[dictionary1 setObject:today forKey:@"date"]; 
[dictionary1 setObject:@"Another value" forKey:@"anotherKey"]; 

[myArray addObject:dictionary1]; 

NSMutableDictionary *dictionary2 = [[NSMutableDictionary alloc] init]; 
NSDate *tomorrow = [[NSDate date] dateByAddingTimeInterval:60*60*24]; 
[dictionary2 setObject:tomorrow forKey:@"date"]; 
[dictionary2 setObject:@"Yet another value" forKey:@"anotherKey"]; 

[myArray addObject:dictionary2]; 

NSSortDescriptor *sortDesciptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]; 

//Create new sorted array 
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:@[sortDesciptor]]; 

//Or sort your mutable one 
[myArray sortUsingDescriptors:@[sortDesciptor]]; 
1

Есть много способов сделать это. Вы можете использовать NSSortDescriptor, как говорит Кривоблоцкий.

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

[myArray sortUsingComparator 
    ^(NSDictionary *obj1, NSDictionary *obj2) 
    { 
    return [obj1["date"] compare: obj2["date"]] 
    } 
]; 

Метод sortUsingComparator принимает NSComparator блок.

NSComparator принимает два объекта типа идентификатора, и возвращает NSComparisionResult:

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2); 

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

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