Reputation: 7847
I'm trying to figure out a tidy way of ordering objects in an array based on a custom ordering scheme that I define.
In the example below if I printed out the "someText" values for each object in my unsorted array, my desired output would be.
->Cow ->Cow ->Pig ->Dog
What would be my best option to achieve this custom sorting?
NSArray *scheme=@[@"Cow",@"Pig",@"Dog"];
@interface TestObject : NSObject
@property (strong, nonatomic) NSString *someText;
@end
@interface Test : NSObject
@property (strong, nonatomic) NSMutableArray *unSortedObjects;
@end
@implementation Test
-(void)setup
{
TestObject *t1=[Test alloc]init];
t1.someText=@"Dog";
[unSortedObjects addObject:t1];
TestObject *t2=[Test alloc]init];
t2.someText=@"Pig";
[unSortedObjects addObject:t2];
TestObject *t3=[Test alloc]init];
t3.someText=@"Cow";
[unSortedObjects addObject:t3];
t4.someText=@"Cow";
[unSortedObjects addObject:t4];
}
@end
Upvotes: 1
Views: 142
Reputation: 170809
You can use sortUsingComparator:
function in NSMutableArray. If order depends only on 'someText' value then naive implementation may look like:
[panels_ sortUsingComparator:^NSComparisonResult(TestObject* obj1, TestObject* obj2) {
NSArray *scheme = @[@"Cow",@"Pig",@"Dog"];
NSUInteger ix1 = [scheme indexOfObject:obj1.someText];
NSUInteger ix2 = [scheme indexOfObject:obj2.someText];
if (ix1 < ix2){
return NSOrderedAscending;
}
else if (ix1 > ix2){
return NSOrderedDescending;
}
return NSOrderedSame;
}];
Upvotes: 4
Reputation: 27335
[unSortedObjects sortUsingComparator: ^(id obj1, id obj2) {
if ([scheme indexOfObject:obj1] > [scheme indexOfObject:obj2]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([scheme indexOfObject:obj1] < [scheme indexOfObject:obj2]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
Upvotes: 0
Reputation: 1927
You can easily do that with:
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
//Here you can return NSOrderedSame, NSOrderedAscending or NSOrderedDescending
//based on your logic
}];
Upvotes: 1