1

I have an NSArray that contains nested NSArrays. Im looking for a way to sort the parent array according to the object count of the nested arrays in ascending order. so if [array1 count] is 4, [array2 count] is 2 and [array3 count] is 9, i would get : array2, array1, array3...

2 Answers 2

9

There are a few solutions, one of which is:

NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"@count"
                                                     ascending:YES];
NSArray *sds = [NSArray arrayWithObject:sd];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:sds];
Sign up to request clarification or add additional context in comments.

4 Comments

@Sam Indeed, and you can always use the @count collection operator for KVC compliant collections.
Ah, my apologies. I wasn't aware of that / misread your code. Very cool!
works great!.. i tried it earlier before asking the question but i was using @"count" as key and it was crashing... whats the secret with @"@count"???
@KDaker NSArray doesn’t have a KVC compliant key called count. There is an instance method called -count but it isn’t a key in the KVC sense. That said, in Cocoa collections you can use special key paths called collection operators, and @count is one of them.
1
static NSInteger MONSortObjectsAscendingByCount(id lhs, id rhs, void* ignored) {
/* error checking omitted */
    const NSUInteger lhsCount = [lhs count];
    const NSUInteger rhsCount = [rhs count];

    if (lhsCount < rhsCount) {
        return NSOrderedAscending;
    }
    else if (lhsCount > rhsCount) {
        return NSOrderedDescending;
    }
    else {
        return NSOrderedSame;
    }
}

/* use if mutable, and you wnat it sorted in place */
- (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare context:(void *)context;

/* else use */
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))compare context:(void *)context;

2 Comments

A function whose name doesn’t start with MON? Who are you and what have you done to Justin?
ugggghhhhhhhhhh!!!!!!! =p Justin has a headache today, and the build was finished. thanks for pointing that out -- i've fixed it now =)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.