2013-07-05 4 views
1

У меня есть массив массивов. В дочерних массивах содержатся объекты. Как я могу сортировать эти дочерние массивы в родительском массиве, чтобы они отсортировались с первым массивом, который содержит большинство объектов до последнего дочернего массива, который содержит наименьшие объекты?Сортировка массива в соответствии с количеством дочерних массивов

ответ

4

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

NSArray* sortedArray= [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 
{ 
    return [obj2 count] - [obj1 count]; 
}]; 

Дальнейшее объяснение

NSComparisonResult это перечисление:

enum { 
    NSOrderedAscending = -1, 
    NSOrderedSame,    // 0 
    NSOrderedDescending  // +1 
}; 

Таким образом, вычитая счетчики двух массивов вы получаете правильный порядок, избегая писать обычные скучные if-then-els е. Для удобства чтения и не перепутать идеи новичкам добавить длинную версию здесь:

NSArray* sortedArray= [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 
{ 
    if([obj1 count] > [obj2 count]) 
     return NSOrderedAscending; 
    if([obj1 count] < [obj2 count]) 
     return NSOrderedDescending; 
    return NSOrderedSame; 
}]; 

Alternative

используя тоже своего рода дескриптор с оператором сбора на @count элегантна:

NSSortDescriptor* descriptor= [NSSortDescriptor sortDescriptorWithKey: @"@count" ascending: NO]; 
NSArray* sortedArray= [array sortedArrayUsingDescriptors: @[ descriptor ]]; 
+0

Это также может быть сделано с помощью дескриптора сортировки сортировки – uchuugaka

+0

Вам не нужен специальный. Просто '[NSSortDescriptor sortDescriptorWithKey: @" count "по возрастанию: YES]'. –

+0

@KenThomases Ключ должен быть @ "@ count", и порядок не должен возрастать, он хочет, чтобы они отсортировались, начиная с более длинного. –

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