I have an NSArray which is populated with objects from an NSMutableArray. Most of these object have integer values like \"1\", \"2\", \"3\", \"4\", \"5\", sometimes there is
try using -[NSString compare:options:]
with NSNumericSearch
. To use that with -sortedArrayUsingSelector:
you have to wrap the compare call into a separate category method on NSString
:
- (NSComparisonResult)numericCompare:(NSString *)aString {
return [self compare:aString options:NSNumericSearch];
}
For sorting Descending
NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
return [str1 compare:str2 options:NSNumericSearch];
}];
sortedArray = [[sortedArray reverseObjectEnumerator] allObjects];`
And for asending
NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
return [str1 compare:str2 options:NSNumericSearch];
}];
You can use NSArray
's -sortedArrayUsingComparator:
method to get a sorted array using a custom block. I find this more convenient than -sortedArrayUsingSelector:
, because you can declare the comparator inline, like so:
NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil];
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
return [str1 compare:str2 options:NSNumericSearch];
}];
This will return an array that looks like so:
(
1,
2,
4,
5,
10,
Hello,
Hi
)
In general, it's pretty nice to use blocks because they eliminate the need to create random selectors that run amuk in your code.