对 NSIndexPaths 数组进行排序
Posted
技术标签:
【中文标题】对 NSIndexPaths 数组进行排序【英文标题】:Sorting an array of NSIndexPaths 【发布时间】:2013-02-18 02:53:00 【问题描述】:我有一个包含NSIndexPath
对象的NSMutableArray
,我想按它们的row
升序对它们进行排序。
最短/最简单的方法是什么?
这是我尝试过的:
[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2)
NSIndexPath *indexPath1 = obj1;
NSIndexPath *indexPath2 = obj2;
return [@(indexPath1.section) compare:@(indexPath2.section)];
];
【问题讨论】:
【参考方案1】:您说要按row
排序,但您比较section
。另外,section
是NSInteger
,所以不能在上面调用方法。
修改您的代码如下以在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;
];
【讨论】:
【参考方案2】:您还可以使用 NSSortDescriptors 来按 'row' 属性对 NSIndexPath 进行排序。
如果self.selectedIndexPath
是不可变的:
NSSortDescriptor *rowDescriptor = [[NSSortDescriptor alloc] initWithKey:@"row" ascending:YES];
NSArray *sortedRows = [self.selectedIndexPaths sortedArrayUsingDescriptors:@[rowDescriptor]];
或者如果self.selectedIndexPath
是NSMutableArray
,简单地说:
NSSortDescriptor *rowDescriptor = [[NSSortDescriptor alloc] initWithKey:@"row" ascending:YES];
[self.selectedIndexPaths sortedArrayUsingDescriptors:@[rowDescriptor]];
简单而简短。
【讨论】:
【参考方案3】:对于可变数组:
[self.selectedIndexPaths sortUsingSelector:@selector(compare:)];
对于不可变数组:
NSArray *sortedArray = [self.selectedIndexPaths sortedArrayUsingSelector:@selector(compare:)]
【讨论】:
【参考方案4】:迅速:
let paths = tableView.indexPathsForSelectedRows() as [NSIndexPath]
let sortedArray = paths.sorted $0.row < $1.row
【讨论】:
是的,函数式语言中的排序要短得多。以上是关于对 NSIndexPaths 数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章