按降序排序NSArray

Jor*_*eña 34 iphone cocoa objective-c

我有一个NSArrayNSNumber,我已经成功地整理利用以下升序排列对象:

[myArray sortedArrayUsingSelector:@selector(compare:)]
Run Code Online (Sandbox Code Playgroud)

但是,我需要按降序排序.我认为compare:它只按升序排序.虽然我可以解决这个问题NSArray,但我很好奇是否有更简单或更有效的方法来实现这一目标.

编辑:我发现这个问题提供了一种简单的反向迭代方法NSArray:

for (id someObject in [myArray reverseObjectEnumerator])
Run Code Online (Sandbox Code Playgroud)

这工作正常,我想这是一个很好的简单解决方案,但我很好奇是否有一种方法来按降序指定排序.

Jer*_*myP 80

使用排序描述符

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" 
                                                            ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];
Run Code Online (Sandbox Code Playgroud)


vod*_*ang 12

另一种方式,imo,也很好:用类别写另一个reverseCompare:

@implementation NSNumber (Utility)

- (NSComparisonResult)reverseCompare:(NSNumber *)aNumber {
  return [aNumber compare:self];
}
Run Code Online (Sandbox Code Playgroud)

好处是你可以在任何地方重用,而不必用反向迭代来编写循环.不好的是你必须写更多的代码:)


Pet*_*sey 6

有几种方法:

  1. 编写比较函数并将其传递给sortUsingFunction:context:.
  2. 使用sortUsingComparator:,需要一个块.(仅适用于Mac OS X 10.6及更高版本以及iOS 4.0及更高版本.)
  3. 使用sortUsingDescriptors:,并传递至少一个ascending属性为false的排序描述符的数组.

在前两种情况下,您的比较应该简单地返回您通常使用的比较器(例如,compare:)返回的否定.最后一个涉及较少的自定义代码,所以这就是我使用的.


Ben*_*lam 6

像这样使用sortarrayusingcomparator方法

NSArray *sortedArray = [array sortedArrayUsingComparator:
^NSComparisonResult(id obj1, id obj2){
        return [obj2 compare:obj1];
    }];
Run Code Online (Sandbox Code Playgroud)

通过反转对象的顺序,您将获得降序