块比较器如何在Obj C中工作?

时间:2013-04-21 22:30:57

标签: objective-c sorting objective-c-blocks

这不是我怎么做这篇文章的。相反,我想了解它是如何工作的,希望其他人也可以学习。

对于这个例子,假设我有一个带有NSDecimalNumber对象的NSMutableArray。假设内部的对象没有特定的顺序,是[-464.50, +457.20, 0, -1000]。在比较它们之前,我将绝对值应用于它们。

在我的代码中,我使用sortUsingComparator方法并给它一个块。我开始测试不同的条件,这是结果,因为它们在UITableView中显示:

return [person1Amount compare:person2Amount];
==> 0, 457.20, -464.50, -1000

如果,

return [person2Amount compare:person1Amount];
==> -1000, -464.50, +457.42, 0

compare:方法实际上是如何工作的。 NSDecimalNumber doc here并没有真正向我解释。这部分特别让我困惑:

  

如果decimalNumber的值为,则返回值NSOrderedAscending   大于接收者; NSOrderedSame如果他们是平等的;和   如果decimalNumber的值小于,则为NSOrderedDescending   接收机。

这是否意味着数组中对象的顺序决定了它的排序方式?例如,如果person1.number < person2.number,它会按升序对数组进行排序吗?为什么我的代码[person2Amount compare:person1Amount]会产生正确的结果?

它看起来像person2Amount is < person1Amount,所以它按顺序排序,但如果person2Amount is > person1Amount,那么它将按升序排序吗?

我的理解似乎不对。

谢谢!

2 个答案:

答案 0 :(得分:2)

好像你已回答了自己的问题。

return [person1Amount compare:person2Amount];

VS

return [person2Amount compare:person1Amount];

考虑以上两个陈述; compare:方法返回NSOrderedAscendingNSOrderedDescending,具体取决于两个对象中哪一个大于另一个。

如果你这样做:

return [@1 compare:@2];

VS

return [@2 compare:@1];

然后,您将收到NSOrderedAscendingNSOrderedDescending,原因应该是显而易见的原因。

因此,如果您实现自己的compare:方法并切换用于比较的两个对象(如上面的@ 1与@ 2情况一样),您将有效地反转数组的排序顺序

答案 1 :(得分:1)

由于您要比较绝对值,我们忽略这些符号。你的数字是464.50,457.20,0和1000.升序意味着数字变大,所以订单将是0,457.20,464.50,1000。降序意味着它们变小,所以订单是1000,464.50,457.20, 0

使用比较器时,阵列会根据比较器按升序排序。它将成对的值发送给比较器。如果比较器返回它们是按升序排列,则它将第一个放在第一位。如果它返回它们按降序排列,则将第二个放在第一位。

NSNumber compare:方法基本上就是这样(当然你不能在NSNumbers上使用><,但这是主意):

- (NSComparisonResult)compare:(NSNumber *)number2 {
    if(self < number2) return NSOrderedAscending;
    if(self > number2) return NSOrderedDescending;
    return NSOrderedSame;
}

因此,如果您的比较器调用[number1 compare:number2],如果数字是递增的(数字1更小),结果将是升序,这意味着它们将保持该顺序并在数组中升序。如果比较器切换它们[number2 compare:number1],如果数字正在下降(数字2更小),结果将是升序的,因此它们将被切换并在数组中下降。