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

时间:2011-11-08 17:54:52

标签: objective-c cocoa sorting nsarray

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

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 个答案:

答案 0 :(得分:24)

如果要对降序进行排序,则只需翻转比较(或翻转NSComparisonResult s)。当您可以直接在块中控制时,不需要通过ascending:参数来膨胀API。

答案 1 :(得分:4)

只需更改逻辑:

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的名称。

答案 2 :(得分:4)

来自-sortedArrayUsingComparator:的文档:

“返回一个数组,按升序列出接收数组的元素,由给定的NSComparator Block指定的比较方法确定。”

所以你不得不求助于

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

但当然这意味着首先滚动你自己的NSSortDescriptor对象,这可能很适合你的目的。

答案 3 :(得分:4)

您可以翻转操作符。

“隐藏于你的位”并不关心升序或降序,因为它对你的对象一无所知。这就像问你的同事冰球是否大于或小于麝鼠。内部实现只使用排序算法(可能使用数组的大小确定)并使用块函数来比较两个对象。

答案 4 :(得分:4)

作为旁注,您可以使用此

获得数组的反转顺序

[[NSArray reverseObjectEnumerator] allObjects];

来源:https://stackoverflow.com/a/586529/1382210