別の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
)を反転させる必要がありますか?
降順で並べ替える場合は、比較を反転します(またはNSComparisonResult
sを反転します)。ブロック内で直接制御できる場合は、ascending:
パラメーターを使用してAPIを肥大化させる必要はありません。
補足として、これを使用して配列の逆の順序を取得することができます
[[NSArray reverseObjectEnumerator] allObjects];
ロジックを変更するだけです。
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
のような名前のメソッドにするのが最適な場合があります。
-sortedArrayUsingComparator:
のドキュメントから:
「指定されたNSComparatorブロックで指定された比較方法によって決定された、受信配列の要素を昇順でリストする配列を返します。」
だからあなたは使用に頼らなければならないでしょう
- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors
しかしもちろん、それはあなた自身のNSSortDescriptorオブジェクトを最初にロールすることを意味し、それはあなたの目的にうまく合うかもしれません。
演算子を反転できます。
「あなたから隠されているビット」は、オブジェクトについて何も知らないため、昇順や降順を気にしません。これは、ホッケーのパックがマスクラットよりも大きいか小さいかを同僚に尋ねるようなものです。内部実装は、ソートアルゴリズム(おそらく配列のサイズを使用して決定される)を使用し、ブロック関数を使用して2つのオブジェクトを比較します。