-[NSArray sortedArrayUsingComparator:]的排序顺序如何更改?

18

我需要从另一个NSArray生成一个排序的NSNumber数组。我想使用sortedArrayUsingComparator:方法。我在苹果文档中找到了这个例子:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
    if ([obj1 integerValue] > [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }

    if ([obj1 integerValue] < [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }

    return (NSComparisonResult)NSOrderedSame;
}];

我只是在一个块中提供比较器,这很好。排序本身--使用此块隐藏的部分--似乎是升序的。

我想知道是否可以在此块之外请求不同的排序顺序,或者我只需要翻转<>(或NSOrderedXXX)即可?

5个回答

24
如果您想要进行降序排列,只需要反转比较操作(或者反转NSComparisonResult)。没有必要通过添加一个 "ascending:" 参数来使API变得臃肿,因为您可以直接在块中控制它。

5

只需更改逻辑:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {

 if ([obj1 integerValue] > [obj2 integerValue]) {
      return (NSComparisonResult)NSOrderedAscending;
 }

 if ([obj1 integerValue] < [obj2 integerValue]) {
      return (NSComparisonResult)NSOrderedDescending;
 }
 return (NSComparisonResult)NSOrderedSame;
}];

为了更加清晰,最好将此操作封装成一个方法,并使用类似于decendingSort的名称。


1
当然没问题,但是除非你使用橙色交通锥评论,并用红色"耶稣基督墨水"写下已经调换了顺序的说明,否则以后这可能会成为一个潜在的调试噩梦。构建一个排序描述符会更有意义并且能进行自我注释,除非性能会受到严重影响。 - God of Biscuits
@God 一个排序描述符听起来不错,请提供一个实现示例以进行比较。 - zaph

4

-sortedArrayUsingComparator:方法的文档说明如下:

“返回一个数组,其中列出了接收数组的元素按照指定的NSComparator Block比较方法升序排列的顺序。”

因此,您需要使用-sortedArrayUsingComparator:方法重新排序。

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors

当然,这意味着您首先需要自己创建NSSortDescriptor对象,这可能完全适合您的目的。

+1 因为指出这实际上是有记录的。干杯 Jeff。 - Tim

4

4
你可以反转运算符。
对于“你看不到的位”,它并不在乎升序或降序,因为它对你的对象一无所知。这就像问你的同事一个曲棍球比鼹鼠大还是小一样荒谬。内部实现只使用排序算法(可能是根据数组大小确定的),并使用你的块函数来比较两个对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接