Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPhone - Sorting of NSMutableArray containing NSDictionary with 2 keys

Hihi all,

I have an NSMutableArray containing various NSDictionary. In each of the NSDictionary, I have two key-value-pairs, eg: username and loginDate.

I would need to sort all NSDictionary in this NSMutableArray based on loginDate descending and username ascending.

Just to illustrate in more details:

NSMutableArray (index 0): NSDictionary -> username:"user1", loginDate:20 Dec 2011
NSMutableArray (index 1): NSDictionary -> username:"user2", loginDate:15 Dec 2011
NSMutableArray (index 2): NSDictionary -> username:"user3", loginDate:28 Dec 2011
NSMutableArray (index 3): NSDictionary -> username:"user4", loginDate:28 Dec 2011

After the sorting, the result in the array should be:

NSMutableArray (index 0): NSDictionary -> username:"user3", loginDate:28 Dec 2011
NSMutableArray (index 1): NSDictionary -> username:"user4", loginDate:28 Dec 2011
NSMutableArray (index 2): NSDictionary -> username:"user1", loginDate:20 Dec 2011
NSMutableArray (index 3): NSDictionary -> username:"user2", loginDate:15 Dec 2011

How can I achieve this? Have gone through some of the sortUsingComparator method, can't figure out a way for this.

like image 930
joe kirk Avatar asked Nov 30 '11 15:11

joe kirk


1 Answers

Maybe something like this?

[array sortUsingDescriptors:
 [NSArray arrayWithObjects:
  [[[NSSortDescriptor alloc]
    initWithKey:@"loginDate"
    ascending:NO]
   autorelease],
  [[[NSSortDescriptor alloc]
    initWithKey:@"username"
    ascending:YES]
   autorelease],
  nil]];

If you build for iOS 4 or higher you can even do:

[array sortUsingDescriptors:
 [NSArray arrayWithObjects:
  [NSSortDescriptor sortDescriptorWithKey:@"loginDate" ascending:NO],
  [NSSortDescriptor sortDescriptorWithKey:@"username" ascending:YES],
  nil]];

This works using the compare: method to compare property key values, that is the value returned by valueForKey:. In the case of NSDictionary it will more or less just call objectForKey: to get the value. There are some special notations like prefixing key name with "@", see Difference valueforKey objectForKey for more details.

like image 137
Mattias Wadman Avatar answered Oct 05 '22 00:10

Mattias Wadman