Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sorting an array of NSIndexPaths

I have an NSMutableArray that contains NSIndexPath objects, and I'd like to sort them by their row, in ascending order.

What's the shortest/simplest way to do it?

This is what I've tried:

[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSIndexPath *indexPath1 = obj1;
    NSIndexPath *indexPath2 = obj2;
    return [@(indexPath1.section) compare:@(indexPath2.section)];
}];
like image 356
Eric Avatar asked Feb 18 '13 02:02

Eric


2 Answers

You said that you would like to sort by row, yet you compare section. Additionally, section is NSInteger, so you cannot call methods on it.

Modify your code as follows to sort on the row:

[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSInteger r1 = [obj1 row];
    NSInteger r2 = [obj2 row];
    if (r1 > r2) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if (r1 < r2) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];
like image 99
Sergey Kalinichenko Avatar answered Oct 10 '22 06:10

Sergey Kalinichenko


You can also use NSSortDescriptors to sort NSIndexPath by the 'row' property.

if self.selectedIndexPath is non-mutable:

NSSortDescriptor *rowDescriptor = [[NSSortDescriptor alloc] initWithKey:@"row" ascending:YES];
NSArray *sortedRows = [self.selectedIndexPaths sortedArrayUsingDescriptors:@[rowDescriptor]];

or if self.selectedIndexPath is a NSMutableArray, simply:

NSSortDescriptor *rowDescriptor = [[NSSortDescriptor alloc] initWithKey:@"row" ascending:YES];
[self.selectedIndexPaths sortedArrayUsingDescriptors:@[rowDescriptor]];

Simple & short.

like image 38
So Over It Avatar answered Oct 10 '22 06:10

So Over It