对 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。另外,sectionNSInteger,所以不能在上面调用方法。

修改您的代码如下以在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.selectedIndexPathNSMutableArray,简单地说:

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 数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

js如何对下面数组进行排序?

当我成功对三个数组之一进行排序后,如何对其他数组进行排序

PHP 数组排序

PHP 数组排序:内置函数算法排序

PHP 数组排序:内置函数算法排序

php怎么对数组进行排序