What I want to do seems pretty simple, but I can't find any answers on the web. I have an NSMutableArray
of objects, and let's say they are 'Person' objects. I want to sort the NSMutableArray
by Person.birthDate which is an NSDate
.
I think it has something to do with this method:
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];
In Java I would make my object implement Comparable, or use Collections.sort with an inline custom comparator...how on earth do you do this in Objective-C?
If you're just sorting an array of
NSNumbers
, you can sort them with 1 call:That works because the objects in the array (
NSNumber
objects) implement the compare method. You could do the same thing forNSString
objects, or even for an array of custom data objects that implement a compare method.Here's some example code using comparator blocks. It sorts an array of dictionaries where each dictionary includes a number in a key "sort_key".
The code above goes through the work of getting an integer value for each sort key and comparing them, as an illustration of how to do it. Since
NSNumber
objects implement a compare method, it could be rewritten much more simply:or the body of the comparator could even be distilled down to 1 line:
I tend to prefer simple statements and lots of temporary variables because the code is easier to read, and easier to debug. The compiler optimizes away the temporary variables anyway, so there is no advantage to the all-in-one-line version.
Sort using NSComparator
If we want to sort custom objects we need to provide
NSComparator
, which is used to compare custom objects. The block returns anNSComparisonResult
value to denote the ordering of the two objects. So in order to sort whole arrayNSComparator
is used in following way.Sorts Using NSSortDescriptor
Let’s assume, as an example, that we have an array containing instances of a custom class, Employee has attributes firstname, lastname and age. The following example illustrates how to create an NSSortDescriptor that can be used to sort the array contents in ascending order by the age key.
Sort using Custom Comparisons
Names are strings, and when you sort strings to present to the user you should always use a localized comparison. Often you also want to perform a case insensitive comparison. Here comes an example with (localizedStandardCompare:) to order the array by last and first name.
For reference and detailed discussion please refer: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials/objective-c/how-to-sort-nsarray-with-custom-objects/
In my case, I use "sortedArrayUsingComparator" to sort an array. Look at the below code.
Also my object is,
iOS 4 blocks will save you :)
http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html a bit of description
I just done multi level sorting based on custom requirement.
//sort the values
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
Sorting
NSMutableArray
is very simple: