matthewojagiela matthewojagiela - 1 year ago 119
iOS Question

Sort 2 NSArrays By Date

I have 2 NSMutableArrays declared. One is filled with names and then another one is filled with string values of NSDate.

I want to sort both of them according to the date in the second one. For example if element 3 in the date array becomes element 0 I want the same to happen for the name array.

What is the easiest way to do this? I know how to sort the date array just not the corresponding name array!
(Objective-C Please!)

Answer Source

Sorting 2 arrays and keeping them in sync is a pain. You basically have to sort them by hand.

Probably the easiest way to do this is to create an array of dictionaries where each dictionary contains a data and a name.

Then sort the array of dictionaries by date.


Here is the code for creating custom objects containing a name and a date. There is code to sort by date as well as code to sort by name:

 The thing class has a property date and a property name. 
 It is purely for creating sorted arrays of objects
@interface Thing : NSObject

@property (nonatomic, strong) NSDate *date;
@property (nonatomic, strong) NSString *name;


@implementation Thing

 This is a dummy init method that creates a Thing ojbect with a random name and date
- (instancetype) init {
  self = [super init];
  if (!self) return nil;

  NSMutableString *temp = [NSMutableString new];
  for (int x = 0; x < 10; x++) {
    unichar aChar = [letters characterAtIndex:arc4random_uniform(26)];
    [temp appendFormat: @"%C", aChar];
  } = [temp copy];

  //Create a random date
  uint32 halfMax = 2000000000;
  uint32 max = halfMax * 2;
  int32_t value = arc4random_uniform(max) - halfMax;
  NSTimeInterval now = [[NSDate date] timeIntervalSinceReferenceDate]; = [NSDate dateWithTimeIntervalSinceReferenceDate: now + value];
  return self;

- (NSString *) description {
  return [NSString stringWithFormat: @"Name: %@  Date: %@",,];


int main(int argc, const char * argv[]) {
  @autoreleasepool {
    //Create an array of Thing objects
    const int count = 50;
    NSMutableArray *thingArray = [NSMutableArray arrayWithCapacity: count];
    for (int x = 0; x < count; x++) {
      thingArray[x] = [[Thing alloc] init];
    #if 1
      //Sort by date, ascending
      [thingArray sortUsingComparator:^NSComparisonResult(Thing  *obj1,
                                                          Thing  *obj2) {
        NSComparisonResult bigger =  
          [ timeIntervalSinceReferenceDate] < 
          [ timeIntervalSinceReferenceDate] ?  
            NSOrderedAscending : NSOrderedDescending;
        return bigger;
      //Sort by name
      [thingArray sortUsingComparator:^NSComparisonResult(Thing  *obj1,
                                                          Thing  *obj2) {
        return [ compare:];
    NSLog(@"%@", thingArray);
    return 0;
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download