並べ替え用の API は、通常、NSSortDescriptors
1 つだけでなく の配列を使用できます。
たとえば、オブジェクトの配列を取る (複数形に注意)NSArray
というメソッドがあります。sortedArrayUsingDescriptors:
NSSortDescriptor
したがって、次のように簡単に書くことができます。
NSSortDescriptor *endCalYearSD = [NSSortDescriptor sortDescriptorWithKey:@"endCalYear" ascending:YES];
NSSortDescriptor *endMonthSD = [NSSortDescriptor sortDescriptorWithKey:@"endMonth" ascending:YES];
NSSortDescriptor *periodLenSD = [NSSortDescriptor sortDescriptorWithKey:@"periodLength" ascending:YES];
NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:@[endCalYearSD, endMonthSD, periodLenSD]];
このように、originalArray
最初に endCalYear でソートされ、同じ endCalYear を持つ各エントリが endMonth でソートされ、同じ endCalYear と endMonth を持つ各エントリが periodLendth でソートされます。
ソートを提案するほとんどの API (CoreData などを含む) で sortDescriptors の配列を使用する API があるため、原則は常に同じです。
本当に1つだけに固執する必要がある場合NSSortDescriptor
(およびソートアルゴリズムがブロックベースのコンパレータまたはの配列を使用するほど柔軟でない場合NSSortDescriptors
)、カスタムオブジェクトにプロパティを提供して、値を計算することができます。ソートアルゴリズムのベース。
たとえば、そのようなメソッドをカスタム クラスに追加します。
-(NSUInteger)sortingIndex {
return endCalYear*10000 + endCalMonth*100 + periodLength;
}
次に、このキー/プロパティで並べ替えます。これは読みやすく、非常にきれいなデザイン パターンではありませんが、ソート アルゴリズム API を変更して一度に複数のキーでソートできるようにすることをお勧めします。</p>
[EDIT] (ブロックベースの API で [EDIT] に回答するため)
ブロックベースの API が機能しない理由がわかりませんsortDescriptorWithKey:ascending:comparator:
。そこで必要なカスタムNSComparator
ブロックを指定できるため、このブロックは 2 つのオブジェクトが与えられた場合に、どちらが前にあるかを判断できます。どれがどれより前にあるかを判断する方法はあなた次第です。比較できるのは、、、、などだけなのでendCalYear
、ここでは複数のキーを使用した並べ替えに関する制限はありません。endCalYear
endMonth