我需要从另一个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
是的?
答案 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];