2013-04-25 19 views
6

一個NSArray我需要一個NSArray包含時間NSString的,如排序,iOS的時間順序來的NSString的

NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"09:00 AM",@"07:30 AM",@"06:45 PM",@"05:00 PM",@"12:45 AM",@"12:45 PM",@"01:00 AM",@"01:15 PM", nil]; 

我需要做的是在時間的升序排序的數組。
有沒有辦法做這樣的事情?

+0

看到這個答案http://stackoverflow.com/questions/1132806/sort-nsarray-of-date-strings -or-objects/1134126#1134126 – 2013-04-25 07:18:25

回答

10
NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"09:00 AM",@"07:30 AM",@"06:45 PM",@"05:00 PM",@"12:45 AM",@"12:45 PM",@"01:00 AM",@"01:15 PM", nil]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"hh:mm a"]; 

NSArray *sortedTimes = [times sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) 
{ 
    NSDate *date1 = [dateFormatter dateFromString:obj1]; 
    NSDate *date2 = [dateFormatter dateFromString:obj2]; 
    return [date1 compare:date2]; 
}]; 

優化版本:

NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"09:00 AM",@"07:30 AM",@"06:45 PM",@"05:00 PM",@"12:45 AM",@"12:45 PM",@"01:00 AM",@"01:15 PM", nil]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"hh:mm a"]; 

NSMutableArray *dates = [NSMutableArray arrayWithCapacity:times.count]; 
for (NSString *timeString in times) 
{ 
    NSDate *date = [dateFormatter dateFromString:timeString]; 
    [dates addObject:date]; 
} 

[dates sortUsingSelector:@selector(compare:)]; 

NSMutableArray *sortedTimes = [NSMutableArray arrayWithCapacity:dates.count]; 
for (NSDate *date in dates) 
{ 
    NSString *timeString = [dateFormatter stringFromDate:date]; 
    [sortedTimes addObject:timeString]; 
} 
+0

添加了一個編輯。第二個版本似乎更好,因爲在那裏使用較少的NSString/NSDate轉換。 – filwag 2013-04-25 07:47:28

3

由於這些字符串將sored爲

01:15,12:25,05:00 ....

而且他們也不NSDate

所以你需要做的是,從這些字符串創建一個具有NSDate的並行數組,對數組進行排序並提取這些值。


儘管實現我解決了它的新手方式

NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"09:00 AM",@"07:30 AM",@"06:45 PM",@"05:00 PM",@"12:45 AM",@"12:45 PM",@"01:00 AM",@"01:15 PM", nil]; 

NSMutableArray *dates=[NSMutableArray new]; 

NSDateFormatter *dateFormatter=[NSDateFormatter new]; 
[dateFormatter setDateFormat:@"hh:mm a"]; 

for (NSString *stringDate in times) { 
     NSDate *date=[dateFormatter dateFromString:stringDate]; 
     [dates addObject:date]; 
} 

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; 
NSArray *descriptors = [NSArray arrayWithObject: descriptor]; 
NSArray *reverseOrder = [dates sortedArrayUsingDescriptors:descriptors]; 

[times removeAllObjects]; 
for (NSDate *date in reverseOrder) { 
     NSString *string=[dateFormatter stringFromDate:date]; 
     [times addObject:string]; 
} 

NSLog(@"%@",times); 
+3

讓我想起在最近的iOS開發者入口重新設計「設備歷史」頁面的日期之前,它是如何按字母順序排序的:http://i.imgur.com/3ePRr.png – Kreiri 2013-04-25 07:24:23

0

對於NSDate的比較使用:

+ (BOOL)isDate:(NSDate *)date1 smallerThanAnotherDate:(NSDate *)date2 
{ 
    NSDate* enddate = date1; 
    NSDate* currentdate = date2; 
    NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate]; 
    double secondsInMinute = 60; 
    NSInteger secondsBetweenDates = distanceBetweenDates/secondsInMinute; 

    if (secondsBetweenDates == 0) 
     return YES; 
    else if (secondsBetweenDates < 0) 
     return YES; 
    else 
     return NO; 
} 

所以,如果你不想轉換您小時的NSDate做到這一點單獨適用於我

NSArray *sortedTimes = [times sortedArrayUsingSelector:@selector(localizedStandardCompare:)]; 
+0

OP詢問關於字符串雖然。不是日期。 – Fogmeister 2013-04-25 07:20:24

4

你可以試試這個代碼:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"hh:mm a"]; 
    [times sortUsingComparator:^NSComparisonResult(NSString* obj1, NSString *obj2) { 
     NSDate *firstDate = [formatter dateFromString:obj1]; 
     NSDate *secondDate = [formatter dateFromString:obj2]; 
     return [firstDate compare:secondDate]; 
    }]; 
+0

@satheeshwaran我是新來的SO,我如何突出顯示您的代碼段?謝謝。 – danypata 2013-04-25 07:39:49

+0

選擇要移動到代碼塊的所有文本,然後單擊頂部的{},它位於粗體,斜體按鈕旁邊。 – satheeshwaran 2013-04-25 07:42:26