2011-08-17 5 views
5

私は2種類のオブジェクトを含むNSMutableArrayを持っています。2種類のオブジェクトを含むNSmutableArrayをソートしますか?

両方のオブジェクトには、異なる名前の日付(日付の異なる文字列)が含まれています。

日付に基づいてすべてを並べ替えるには、どのような方法が最善の方法ですか?この状況でNSSortDescriptorを使用することはできますか?

答えて

4

あなたは、Mac OS X 10.6またはiOS4ををターゲットに、より高いている場合は、クラスのチェックのほかに、この

NSDateFormatter *formatter1 = ...; //create and configure date formatter for Class1 
NSDateFormatter *formatter2 = ...; //create and configure date formatter for Class2 


[arrayOfObjects sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSDate *date1 = nil, *date2 = nil; 
    //Get first objects date 
    if([obj1 isKindOfClass:[Class1 class]]) 
    { 
     date1 = [formatter1 dateFromString:[obj1 class1Date]]; 
    } 
    else if([obj1 isKindOfClass:[Class2 class]]) 
    { 
     date1 = [formatter2 dateFromString:[obj1 class2Date]]; 
    } 

    //Get second objects date 
    if([obj2 isKindOfClass:[Class1 class]]) 
    { 
     date2 = [formatter1 dateFromString:[obj2 class1Date]]; 
    } 
    else if([obj2 isKindOfClass:[Class2 class]]) 
    { 
     date2 = [formatter2 dateFromString:[obj2 class2Date]]; 
    } 

    NSAssert(date1 != nil, @"Could not parse date from %@", obj1); 
    NSAssert(date2 != nil, @"Could not parse date from %@", obj2); 

    return [date1 compare:date2]; 
}]; 

に似たコンパレータを使用してソートすることができ、それはセレクタに応答した場合、あなたもチェックすることができます。

+2

はかなり不要です。 – Chuck

+0

さて、NSArrayにはいくつかの "sortUsing ..."メソッドがあり、それらのうちのどれかがそのジョブを実行する必要があります。 –

+0

BTW - カテゴリを使用している場合は 'isKindOfClass:'または 'respondsToSelector:'を実行する必要はありません。 – nielsbot

1

カテゴリを追加して、日付フィールド名を統一することができます。あなたがこれを行うことができます...のは、クラスAのインスタンスは、フィールド「creationDateString」を持つフィールド「日付ストリング」とクラスBのインスタンスを持っているとしましょう:

@implementation A (SortByDate) 

-(NSDate*)sortDate 
{ 
    static NSDateFormatter * formatter = nil ; 
    static dispatch_once_t once = 0 ; 
    dispatch_once(& once, ^{ formatter = ... }) ; 

    return [ formatter dateFromString:self.dateString ] ; 
} 
@end 

@implementation B (SortByDate) 
-(NSDate*)sortDate 
{ 
    static NSDateFormatter * formatter = nil ; 
    static dispatch_once_t once = 0 ; 
    dispatch_once(& once, ^{ formatter = ... }) ; 

    return [ formatter dateFromString:self.creationDateString ] ; 
} 
@end 

今、あなたは彼らのsortDateプロパティで使用しているアレイ内のすべてのオブジェクトを並べ替えることができます。

NSArray * sortedByDateArray = [ unsortedArray sortedArrayUsingComparator:^(id a, id b){ 
    return [ [ a sortDate ] compare:[ b sortDate ] ] ; 
}]; 

EDITまたはソート記述子に:id` `からオブジェクトをキャスト

NSArray * sortedArray = [ unsortedArray sortedArrayUsingDescriptors:[ NSArray arrayWithObject:[ NSSortDescriptor sortDescriptorWithKey:@"sortDate" ascending:YES ] ] ] ; 
+0

新しい 'sortDate'プロパティのためにインスタンス単位のストレージを作成することさえできるので、基礎となる文字列で再計算すればよい変更。 – nielsbot

関連する問題