web-dev-qa-db-ja.com

-[NSArraysortedArrayUsingComparator:]のソート順を変更します

別のNSNumberからNSArraysのソートされた配列を生成する必要があります。 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)を反転させる必要がありますか?

18
Tim

降順で並べ替える場合は、比較を反転します(またはNSComparisonResultsを反転します)。ブロック内で直接制御できる場合は、ascending:パラメーターを使用してAPIを肥大化させる必要はありません。

24
Lily Ballard

補足として、これを使用して配列の逆の順序を取得することができます

[[NSArray reverseObjectEnumerator] allObjects];

ソース: https://stackoverflow.com/a/586529/138221

4
mikebob

ロジックを変更するだけです。

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のような名前のメソッドにするのが最適な場合があります。

4
zaph

-sortedArrayUsingComparator:のドキュメントから:

「指定されたNSComparatorブロックで指定された比較方法によって決定された、受信配列の要素を昇順でリストする配列を返します。」

だからあなたは使用に頼らなければならないでしょう

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors

しかしもちろん、それはあなた自身のNSSortDescriptorオブジェクトを最初にロールすることを意味し、それはあなたの目的にうまく合うかもしれません。

4
God of Biscuits

演算子を反転できます。

「あなたから隠されているビット」は、オブジェクトについて何も知らないため、昇順や降順を気にしません。これは、ホッケーのパックがマスクラットよりも大きいか小さいかを同僚に尋ねるようなものです。内部実装は、ソートアルゴリズム(おそらく配列のサイズを使用して決定される)を使用し、ブロック関数を使用して2つのオブジェクトを比較します。

4
Craig Otis