3

Whew... what a title. So I have a NSMutableArray that is assigned data retrieved from an API call. I don't have control of the structure of the API call response, and I would like to sort the array in it's provided format. (other solutions welcome, of course)

This is a silly example (to keep things simple), but the array I'm wanting to sort can be represented something like this:

myObjects = 
array(
  0 => object(
    name => @"Jack",
    favoriteNumbers => object(
      numbers => array(
        0 => 7,
        1 => 11,
        2 => 6
      )
    )
  ),
  1 => object(
    name => @"Jill",
    favoriteNumbers => object(
      numbers => array(
        0 => 1,
        1 => 2,
        2 => 3
      )
    )
  ),
  3 => object(
    name => @"Sally",
    favoriteNumbers => object(
      numbers => array(
        0 => 68,
        1 => 103,
        2 => 99
      )
    )
  )
)

I know I can simply sort by name with something like:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortByDurationArray = [myObjects sortedArrayUsingDescriptors:sortDescriptors]; 
// the variable "myObjects" holds the array representation from above

But how would I sort the array by each persons 1st favorite number?

The desired result would sort the array in the following order: Jill, Jack, Sally; since Jill's 1st favorite number is 1, Jack's is 7 and Sally's is 68.

1 Answer 1

2

You can use NSSortDescriptor’s selector property here. If these objects are their own subclass, then create a selector—something like -compareFavoriteNumberToObject: that returns an NSComparisonResult. If the objects are just something like an NSDictionary, you can make a category on the class to do the comparison.

Sign up to request clarification or add additional context in comments.

2 Comments

So are you suggesting that in my "colors" class I should create a selector, such as -compareFavoriteNumberToObject:, which will compare two "colors" objects that returns a NSComparisonResult? If so, would I do something like this to sort the array? [myObjects sortUsingSelector:@selector(compareFavoriteNumberToObject:)];
Yeah, that sounds appropriate. Strictly speaking, I’d go with -compareFavoriteNumberWithColor:, since you can’t use just any object.

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.