对 NSIndexPaths 数组进行排序

问题描述 投票:0回答:5

我有一个包含

NSMutableArray
对象的
NSIndexPath
,我想按它们的
row
升序对它们进行排序。

最短/最简单的方法是什么?

这是我尝试过的:

[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSIndexPath *indexPath1 = obj1;
    NSIndexPath *indexPath2 = obj2;
    return [@(indexPath1.section) compare:@(indexPath2.section)];
}];
nsmutablearray nsindexpath
5个回答
13
投票

你说你想按

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;
}];

10
投票

您还可以使用 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]];

简单短小。


8
投票

对于可变数组:

[self.selectedIndexPaths sortUsingSelector:@selector(compare:)];

对于不可变数组:

NSArray *sortedArray = [self.selectedIndexPaths sortedArrayUsingSelector:@selector(compare:)]

3
投票

快速:

let paths = tableView.indexPathsForSelectedRows() as [NSIndexPath]
let sortedArray = paths.sorted {$0.row < $1.row}

0
投票

OP 指出:

我有一个包含 NSIndexPath 对象的 NSMutableArray,我想按行对它们进行升序排序。

上面的答案没有考虑到

NSIndexPath
是一个二维数组。因此,按
row
排序只会更改任何原始排序。为了保持原始顺序,需要按
section
排序,并在部分内按
row
排序。

例如,

NSIndexPath
可能包括sections.rows:

1.1, 1.3, 4.1, 4.2 

结果将是:

1.1, 4.1, 4.2, 1.3 

这是按行排序,但顺序不同(许多应用程序希望保留该顺序)。

(我通过尝试精确地进行二维排序找到了这篇文章。)

© www.soinside.com 2019 - 2024. All rights reserved.