2011-11-08 78 views
18

我需要从另一个NSArray生成NSNumber的排序数组。我想使用sortedArrayUsingComparator:方法。我发现苹果的文档在这个例子:更改排序顺序 - [NSArray 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的)?

回答

24

如果你想降序排序,那么只需翻转比较(或翻转NSComparisonResult s)。当您可以直接在块中控制参数时,不需要通过参数ascending:来扩大API。

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

+1

,这是好的。当然,但除非你有橙色装饰它 - 用红色耶稣基督墨迹写的交通注释说明你已经翻转了这个命令,在某个时候,这可能是一个潜在的调试噩梦。 构建一个排序描述符会更有意义,并且会自我评论,除非性能会受到严重打击。 –

+0

@God排序描述符听起来不错,请提供一个用于比较的实现示例。 – zaph

4

-sortedArrayUsingComparator:的文档:

“返回以升序列出了接收阵列的元件,如由给定NSComparator块中指定的比较方法来确定的数组”。

所以你必须诉诸使用

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

但当然,这意味着滚动自己NSSortDescriptor的第一个对象,这可能满足您的目的只是罚款。

+0

+1表示这实际上是记录在案的。欢呼杰夫。 –

4

您可以翻转操作员。

“隐藏的位”不关心上升或下降,因为它不知道任何有关对象的信息。这就像询问你的同事是否曲棍球大于或小于麝鼠一样。内部实现只使用排序算法(可能使用数组大小​​来确定),并使用块函数来比较两个对象。