6

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.

barfoon
  • 27,481
  • 26
  • 92
  • 138
joe kirk
  • 700
  • 2
  • 10
  • 25

1 Answers1

6

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.

Community
  • 1
  • 1
Mattias Wadman
  • 11,172
  • 2
  • 42
  • 57
  • Thanks for the advice, will certainly try it out and feedback again.. :) – joe kirk Nov 30 '11 at 15:45
  • This will sort using the `compare:` selector for each key. You can also specify another selector or use a custom comparator for each sort descriptor if you like. – Mattias Wadman Nov 30 '11 at 15:48