How can I sort an NSMutableArray alphabetically? - iphone

I want to sort an NSMutableArray alphabetically.

You can do this to sort NSMutableArray:
[yourArray sortUsingSelector:#selector(localizedCaseInsensitiveCompare:)];

The other answers provided here mention using #selector(localizedCaseInsensitiveCompare:)
This works great for an array of NSString, however the OP commented that the array contains objects and that sorting should be done according to object.name property.
In this case you should do this:
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:#"name" ascending:YES];
[yourArray sortUsingDescriptors:[NSArray arrayWithObject:sort]];
Your objects will be sorted according to the name property of those objects.

NSSortDescriptor *valueDescriptor = [[NSSortDescriptor alloc] initWithKey:#"name" ascending:YES]; // Describe the Key value using which you want to sort.
NSArray * descriptors = [NSArray arrayWithObject:valueDescriptor]; // Add the value of the descriptor to array.
sortedArrayWithName = [yourDataArray sortedArrayUsingDescriptors:descriptors]; // Now Sort the Array using descriptor.
Here you will get the sorted array list.

In the simplest scenarios, if you had an array of strings:
NSArray* data = #[#"Grapes", #"Apples", #"Oranges"];
And you wanted to sort it, you'd simply pass in nil for the key of the descriptor, and call the method i mentioned above:
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES];
data = [data sortedArrayUsingDescriptors:#[descriptor]];
The output would look like this:
Apples, Grapes, Oranges
For more details check this

Use the NSSortDescriptor class and rest you will get every thing here

NSSortDescriptor * sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:#"Name_your_key_value" ascending:YES];
NSArray * sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray * sortedArray;
sortedArray = [Your_array sortedArrayUsingDescriptors:sortDescriptors];

Maybe this can help you:
[myNSMutableArray sortUsingDescriptors:#[[NSSortDescriptor sortDescriptorWithKey:#"firstName" ascending:YES],[NSSortDescriptor sortDescriptorWithKey:#"lastName" ascending:YES]]];
All is acording to NSSortDescriptor...

Related

Incompatible pointer types sending 'NSSortDescriptor *__strong' to parameter of type 'NSArray *

I am sorting my NSSet using :
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:#"name" ascending:YES];
[[testSet.questions allObjects] sortedArrayUsingDescriptors:descriptor]; // warning
But it causes warning :
Incompatible pointer types sending 'NSSortDescriptor *__strong' to parameter of type 'NSArray *
You're passing a single descriptor where an array is expected, try this:
[testSet.questions allObjects] sortedArrayUsingDescriptors:#[descriptor]];
You should see this method. It requires you to pass an Array object to it, not a NSSortDescriptor object.
[sortDescriptions sortedArrayUsingDescriptors:<#(NSArray *)#>]
so you have to create an array and put your NSSortDescriptor object in it. Try this
NSArray *_sortArray = [[NSArray alloc] initWithObjects:descriptor, nil];
[testSet.questions allObjects] sortedArrayUsingDescriptors:_sortArray];
or
[testSet.questions allObjects] sortedArrayUsingDescriptors:#[descriptor]];
see if it could help:)
NSSortDescriptor should be passed in an array. So you have to create an array then add the descriptor in the array. Now you should pass the array instead of NSSortDescriptor:
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:#"name" ascending:YES];
NSArray *descriptorArray = [NSArray arrayWithObject:descriptor]
[[testSet.questions allObjects] sortedArrayUsingDescriptors:descriptorArray];
Try this :
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:#"name" ascending:YES];
[[testSet.questions allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
Hope this will help.

Objective-c: how to sort a NSMutableArray of UIButtons using their tags

I have a NSMutableArray containing UIButtons. I have given each of the buttons a unique
tag. The buttons will be added to the array in random order, but i want to later sort it so that the buttons are in ascending order with respect to their tags.
Thanks for the help!
Yeap.
Try this:
NSSortDescriptor *ascendingSort = [[NSSortDescriptor alloc] initWithKey:#"tag" ascending:YES];
NSSortDescriptor *descendingSort = [[NSSortDescriptor alloc] initWithKey:#"tag" ascending:NO];
NSArray *sortedArray = [someArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:ascendingSort]];
You can use the NSSortDescriptor to sort a NSArray.
NSArray *unsortedArray = ...
NSArray *sortedArray = [unsortedArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:#"tag" ascending:YES]]];
There are multiple "sortedArrayUsing..." functions. Use the one that seems to fit your needs the best.
(BTW, remember that, since NSMutableArray is a subclass of NSArray, all of the methods of NSArray apply to NSMutableArray as well.)

Sorting Array of Custom Class Objects

I am facing problem that is of sorting. The scenario is explained as: i have a class (Suppose of person) and it has suppose 4 attributes (firstName, lastName, Address, salary) i am creating its object and making a collection of all attributes and putting this object in a NSMutableArray and so on. So at every index of array i have one object (i.e collection of 4 attributes). Now i want to sort that array on the basis of salary can anyone help me out regarding this problem, will be thankful.,
See the documentation for NSArray. It has several sorting methods. Search for the word "sort" and you'll find 'em. (You'll want either the block based or function based API).
use this
NSSortDescriptor *sorter = [[[NSSortDescriptor alloc] initWithKey:#"salary" ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[yorArrary sortUsingDescriptors:sortDescriptors];
Either you implement a compare-method for your object:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingSelector:#selector(compare:)];
or usually even better: (The default sorting selector of NSSortDescriptor is compare:)
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:#"birthDate"
ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

display data in alphabetical order iphone

How to display xml parsed Data in UITableView In alphabetical order.?
In order to display/arrange your data in alphabetical which in a array you have to use NSSortDescriptor
you have to make the object of this NSSortDescriptor class and give data here which you are fetching from XML
NSSortDescriptor *itemXml = [[NSSortDescriptor alloc] initWithKey:#"itemName" ascending:YES];
Now suppose you have an array sortDescriptors
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:itemXml,nil];
[yourArray sortUsingDescriptors:sortDescriptors];
Now give the yourArray to your UITableView delegate methods...... you will get the sorted data on table
NSSortDescriptor *sorter;
sorter = [[NSSortDescriptor alloc]initWithKey:#"Category" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sorter];
[categoryListArray sortUsingDescriptors:sortDescriptors];
[sorter release];
Try This
Actually there are lots of different ways to sort arrays.
Sort descriptors are only one example.
Others are sortedArrayUsingComparator, sortedArrayUsingFunction:context, sortedArrayUsingSelector, and new to Mac OS 10.6 and iOS 4.0, sortedArrayWithOptions:usingComparator.
Those are NSArray methods that return a sorted array.
NSMutableArray also has variations on those methods that sort the mutable array "in place".

NSSortdescriptor, finding the path to the key I wish to use for sorting

I am using an NSSortdescriptor to sort a collection of NSArrays, I then came across a case where the particular NSArray to be sorted contains an NSDictionary who contains an NSDictionary.
I would like to sort from the string paired with a key in the last dictionary.
This is how I would reference the string:
NSDictionary *productDict = [MyArray objectAtIndex:index];
NSString *dealerName = [[productDict objectForKey:#"dealer"] objectForKey:#"name"];
How would I use the dealerName in my NSSortdescriptor to sort the array?
NSSortDescriptor * sortDesc = [[NSSortDescriptor alloc] initWithKey:/* ? */ ascending:YES];
sortedDealerArray = [value sortedArrayUsingDescriptors:sortDesc];
[sortDesc release];
Hope someone could help me a bit with how I go about sorting according to keys inside objects inside other objects:)
Thank you.
actually warrenM is right. You can just use keypaths. #"dealer.name" should work for above.