我有一個NSMutableArray包含2種類型的對象。對包含2種類型的對象的NSmutableArray進行排序?
兩個對象都包含具有不同名稱的日期字段(不同格式的日期字符串)。
根據日期排序它們的最好和最快的方法是什麼?在這種情況下可以使用NSSortDescriptor
嗎?
我有一個NSMutableArray包含2種類型的對象。對包含2種類型的對象的NSmutableArray進行排序?
兩個對象都包含具有不同名稱的日期字段(不同格式的日期字符串)。
根據日期排序它們的最好和最快的方法是什麼?在這種情況下可以使用NSSortDescriptor
嗎?
如果你的目標的Mac OS X v10.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];
}];
除了檢查類,你也可以檢查它是否給選擇響應。
您可以添加一個類別來統一日期字段名稱。比方說,A類的實例有一個字段「dateString」和B類的實例有一個字段「creationDateString」 ......你可以這樣做:
@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 ] ] ;
}];
編輯或用一種描述:
NSArray * sortedArray = [ unsortedArray sortedArrayUsingDescriptors:[ NSArray arrayWithObject:[ NSSortDescriptor sortDescriptorWithKey:@"sortDate" ascending:YES ] ] ] ;
你甚至可以爲你的新'sortDate'屬性創建每個實例的存儲,所以它只需要重新計算底層字符串變化。 – nielsbot
鑄造從'id'的對象是完全沒有必要。 – Chuck
是的,在NSArray上有幾個「sortUsing ...」方法,並且他們中的任何一個都應該完成這項工作。 –
順便說一句 - 沒有必要運行'isKindOfClass:'或'respondsToSelector:'如果你使用類別.. – nielsbot