Objective c 块比较器在Obj C中是如何工作的?

Objective c 块比较器在Obj C中是如何工作的?,objective-c,sorting,objective-c-blocks,Objective C,Sorting,Objective C Blocks,这不是一个我如何做这篇文章。相反,我想了解它是如何工作的,希望其他人也能学习 对于本例,假设我有一个NSMutableArray,其中包含NSDecimalNumber对象。假设里面的对象没有特定的顺序,它们是[-464.50,+457.20,0,-1000]。在比较它们之前,我将绝对值应用于它们 在我的代码中,我使用了sortUsingComparator方法并给它一个块。我开始测试不同的条件,以下是在UITableView中显示的结果: return [person1Amount compa

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

对于本例,假设我有一个NSMutableArray,其中包含NSDecimalNumber对象。假设里面的对象没有特定的顺序,它们是
[-464.50,+457.20,0,-1000]
。在比较它们之前,我将绝对值应用于它们

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

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

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

如果小数位数的值为 大于接收器;如果它们相等,则命名;和 如果小数位数的值小于 接受者

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

它看起来像是
person2Amount是
,所以它按降序排序,但是如果
person2Amount是>person1Amount
,那么它将按升序排序

我的理解似乎不正确


谢谢

看来你已经回答了自己的问题

return [person1Amount compare:person2Amount];
vs

考虑上述两种说法;
compare:
方法返回
sensorderedescing
sensorderedescing
,具体取决于两个对象中哪个大于另一个

如果你要做:

return [@1 compare:@2];
vs

然后,您将收到
sensorderedescending
sensorderedescending
,原因很明显


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

因为您正在比较绝对值,所以让我们忽略符号。您的号码是464.50、457.20、0和1000。升序意味着数字越来越大,所以顺序是0457.20464.501000。降序意味着它们变小了,所以顺序是1000464.50457.20,0

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


NSNumber
compare:
方法基本上是这样工作的(当然你不能使用
我仍然不明白。让我们用一些例子。对于上面的数组[464.50457.20,0,1000],我们想按升序排序[number1 compare:number2]。第一对是[464.50 compare:457.20].查看您的比较方法,self是数字1,因此在语句中(self>number2),因为464.50大于457.20,它将返回true并返回下移。但是[number1 compare:number2]以升序返回数组。这是我不懂的。可能有文字游戏,但这让我很困惑。@Yko比较返回降序,数组总是根据比较器的结果使用升序,因此当返回降序时,它会告诉数组切换顺序。试着写下比较的每一步排序。首先比较第一对,如果结果是递减的,则切换它们。继续执行对,直到它们停止切换。什么是“数组总是根据比较器的结果使用升序?”意思是?所以,第一对返回nsorDeredescending,因为number2>number1。但是,基于该比较器,数组以升序返回它,因此数组将它重新排列为[number1 number2]。如果我设置为[person2 compare:person1],它将返回nsorDeredescending。“数组使用升序”是什么意思是?既然它已经在上升,就不去管它了?那么,它将是[person2 person1],这是对的。你能确认我在这里的结论吗?如果我上面说的是真的,那么关键部分是“数组总是根据比较器的结果使用升序”,这是我不知道的。对。我的意思是什么“基于比较器结果的升序"如果比较器返回升序,它们将保持升序,如果返回降序,它们将被切换。数组不关心实际的顺序,只关心比较器的结果。如果比较器随机返回升序或降序,结果将被随机排序。这对我来说并不明显。让我们使用示例:For[464.50,457.20,0,1000]上面的数组,我们想按升序排序,所以[number1比较:number2]。第一对是[464.50比较:457.20]。看看比较方法,self是number1,所以在语句中(self>number2),因为464.50大于457.20,它将返回true并返回desedescending。但是[number1比较:number2]按升序返回数组。这是我不知道的。可能有文字游戏,但我很困惑。
return [person2Amount compare:person1Amount];
return [@1 compare:@2];
return [@2 compare:@1];
- (NSComparisonResult)compare:(NSNumber *)number2 {
    if(self < number2) return NSOrderedAscending;
    if(self > number2) return NSOrderedDescending;
    return NSOrderedSame;
}