这不是我怎么做这篇文章的。相反,我想了解它是如何工作的,希望其他人也可以学习。
对于这个例子,假设我有一个带有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
,那么它将按升序排序吗?
我的理解似乎不对。
谢谢!
答案 0 :(得分:2)
好像你已回答了自己的问题。
return [person1Amount compare:person2Amount];
VS
return [person2Amount compare:person1Amount];
考虑以上两个陈述; compare:
方法返回NSOrderedAscending
或NSOrderedDescending
,具体取决于两个对象中哪一个大于另一个。
如果你这样做:
return [@1 compare:@2];
VS
return [@2 compare:@1];
然后,您将收到NSOrderedAscending
和NSOrderedDescending
,原因应该是显而易见的原因。
因此,如果您实现自己的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更小),结果将是升序的,因此它们将被切换并在数组中下降。