NSDictionary を詰め込んだ NSArray を NSDictionary のキーでソートしたい場合は NSSortDescriptor が便利です。
NSMutableArray *people = [[NSMutableArray alloc] init]; for (int i = 0; i < 5; i++) { NSMutableDictionary *person = [[NSMutableDictionary alloc] init]; [person setValue:[NSString stringWithFormat:@"person-%d", i] forKey:@"name"]; int age = 20 + (rand() % 20); [person setValue:[NSNumber numberWithInt:age] forKey:@"age"]; NSTimeInterval interval = -1 * (rand() % 10) * 86400; NSDate *createdAt = [NSDate dateWithTimeIntervalSinceNow:interval]; [person setValue:createdAt forKey:@"createdAt"]; [people addObject:person]; } NSLog(@"%@", people);
上記のコードで、以下のような NSDictionary を詰め込んだ NSArray が出来たとします。
( { age = 27; createdAt = "2012-06-09 10:43:55 +0000"; name = "person-0"; }, { age = 33; createdAt = "2012-06-10 10:43:55 +0000"; name = "person-1"; }, { age = 30; createdAt = "2012-06-16 10:43:55 +0000"; name = "person-2"; }, { age = 24; createdAt = "2012-06-10 10:43:55 +0000"; name = "person-3"; }, { age = 23; createdAt = "2012-06-09 10:43:55 +0000"; name = "person-4"; } )
NSSortDescriptor を使ってソートしてみます。
NSSortDescriptor *ageAsc = [[[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES] autorelease]; NSSortDescriptor *createdAtDesc = [[[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:NO] autorelease]; NSArray *descriptors = [NSArray arrayWithObjects:createdAtDesc, ageAsc, nil]; [people sortUsingDescriptors:descriptors]; NSLog(@"%@", people);
以下のようになります。複数のソートキーを指定できるため、SQL の ORDER BY っぽい感覚で使えます。
( { age = 30; createdAt = "2012-06-16 10:43:55 +0000"; name = "person-2"; }, { age = 24; createdAt = "2012-06-10 10:43:55 +0000"; name = "person-3"; }, { age = 33; createdAt = "2012-06-10 10:43:55 +0000"; name = "person-1"; }, { age = 23; createdAt = "2012-06-09 10:43:55 +0000"; name = "person-4"; }, { age = 27; createdAt = "2012-06-09 10:43:55 +0000"; name = "person-0"; } )