2

これは、この投稿を行う方法ではありません。代わりに、私はそれがどのように機能するかを理解したいと思っています。うまくいけば、他の人も学ぶことができます.

この例では、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ドキュメントは、実際には説明していません。この部分は特に私を混乱させます:

戻り値 decimalNumber の値が受信者より大きい場合は NSOrderedAscending。それらが等しい場合は NSOrderedSame。decimalNumber の値がレシーバーより小さい場合は NSOrderedDescending。

これは、配列内のオブジェクトの順序によってソート方法が決まるということですか? たとえば、person1.number < person2.number配列を昇順でソートしますか? [person2Amount compare:person1Amount]私のコードが正しい結果をもたらすのはなぜですか?

のように見えるperson2Amount is < person1Amountので降順でソートされますが、の場合person2Amount is > person1Amount、昇順でソートされますか?

私の理解は正しくないようです。

ありがとう!

4

2 に答える 2

2

あなた自身の質問に答えたようです。

return [person1Amount compare:person2Amount];

対。

return [person2Amount compare:person1Amount];

上記の 2 つのステートメントを検討してください。このcompare:メソッドは、2 つのオブジェクトのどちらが他方よりも大きいかに応じて、NSOrderedAscendingまたはを返します。NSOrderedDescending

あなたがするなら:

return [@1 compare:@2];

対。

return [@2 compare:@1];

NSOrderedAscendingその後、あなたが受け取ったNSOrderedDescending理由は明白なはずです。

したがって、独自のcompare:メソッドを実装し、比較に使用する 2 つのオブジェクトを切り替えると (上記の @1 と @2 の場合のように)、配列の並べ替え順序が効果的に逆になります。

于 2013-04-21T22:45:17.383 に答える
1

絶対値を比較しているので、符号は無視しましょう。数値は 464.50、457.20、0、1000 です。昇順は数値が大きくなることを意味するため、0、457.20、464.50、1000 の順になります。降順は数値が小さくなることを意味するため、1000、464.50、457.20、 0.

コンパレータを使用すると、配列はコンパレータに従って昇順でソートされます。値のペアをコンパレータに送信します。コンパレータがそれらが昇順であることを返した場合、最初のものが最初に配置されます。それらが降順であることが返された場合、2 番目のものが最初に配置されます。

NSNumberメソッドは基本的に次のように機能します (もちろん、NSNumbers でandをcompare:使用することはできませんが、これがアイデアです)。><

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

したがって、コンパレータが を呼び出し[number1 compare:number2]た場合、数値が昇順の場合 (数値 1 が小さい場合)、結果は昇順になります。つまり、数値はその順序のままで、配列内で昇順になります。コンパレーターがそれらを切り替える[number2 compare:number1]と、数値が降順の場合 (数値 2 の方が小さい)、結果は昇順になるため、それらは切り替えられ、配列内で降順になります。

于 2013-04-21T22:53:59.277 に答える