根据子数组计数排序数组

时间:2013-07-05 23:51:09

标签: objective-c

我有一个数组数组。子数组包含对象。如何在父数组中对这些子数组进行排序,以便它们使用第一个数组进行排序,第一个数组是包含最多对象的数组,直到包含最少对象的最后一个子数组?

1 个答案:

答案 0 :(得分: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-else。为了便于阅读并且不要将想法与初学者混淆,我在这里添加了长版:

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;
}];

替代

@count 集合运算符使用排序描述符也很优雅:

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