2013-04-25 38 views
6

tôi cần phải sắp xếp một NSArray chứa thời gian NSString 's chẳng hạn như,iOS loại một NSArray of Time NSString của

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]; 

Những gì tôi cần là để sắp xếp mảng theo thứ tự tăng dần của thời gian.
Có cách nào để làm một việc như vậy không?

+0

thấy câu trả lời này http://stackoverflow.com/questions/1132806/sort-nsarray-of-date-strings -hoặc-đối tượng/1134126 # 1134126 –

Trả lời

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]; 
}]; 

phiên bản tối ưu hóa:

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

Đã thêm một chỉnh sửa. Phiên bản thứ 2 có vẻ tốt hơn vì sử dụng ít chuyển đổi NSString/NSDate hơn. – filwag

3

Như đây là những chuỗi nó sẽ được sored như

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

Và họ không hoặc NSDate.

Vì vậy, bạn cần làm là Tạo một mảng song song có NSDate từ các chuỗi này, sắp xếp mảng và trích xuất các giá trị này.


Trong khi thực hiện tôi giải quyết nó bằng mới làm quen chiều

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

nhắc tôi làm thế nào trước ngày thiết kế lại cổng thông tin dành cho nhà phát triển iOS gần đây trên trang "Lịch sử thiết bị" được sắp xếp theo thứ tự abc: http://i.imgur.com/3ePRr.png – Kreiri

0

Đối NSDate So sánh sử dụng này:

+ (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; 
} 

Vì vậy, nếu bạn không muốn chuyển đổi giờ của bạn để NSDate làm điều này một mình nó hoạt động cho tôi

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

OP hỏi về chuỗi Tuy nhiên. Không phải ngày tháng. – Fogmeister

4

Bạn có thể thử mã này:

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 Tôi mới sử dụng SO, làm cách nào để làm nổi bật đoạn mã như bạn đã làm? Cám ơn. – danypata

+0

Chọn tất cả văn bản bạn muốn di chuyển đến khối mã và nhấp vào {} ở trên cùng, bên cạnh nút In đậm, In nghiêng. – satheeshwaran