2013-04-25 7 views
6

muszę posortować NSArray zawierające czasowych NSString jest taki jakiOS posortować NSArray Czasu NSString na

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

Co potrzebne jest do sortowania tablicy w kolejności rosnącej czasu.
Czy jest jakiś sposób na zrobienie czegoś takiego?

+0

zobaczyć tę odpowiedź http://stackoverflow.com/questions/1132806/sort-nsarray-of-date-strings -lub-objects/1134126 # 1134126 –

Odpowiedz

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

wersja zoptymalizowana:

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

Dodano edycję. Druga wersja wydaje się być lepsza, ponieważ przy użyciu mniej konwersji NSString/NSDate tam. – filwag

3

Ponieważ są to ciągi będzie sored jak

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

I nie są one ani NSDate.

Musisz więc zrobić to: Utwórz równoległą tablicę zawierającą NSDate z tych ciągów znaków, posortuj tablicę i wypakuj te wartości.


Realizując Rozwiązałem go przez początkującego drogi

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

przypomina mi, jak przed ostatnimi datami redesignu portalu dla iOS na stronie "Historia urządzenia" zostały posortowane alfabetycznie: http://i.imgur.com/3ePRr.png – Kreiri

0

Dla porównania NSDate użyć tego:

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

Więc jeśli nie chcesz, aby przekształcić godziny do NSDate to zrobić sam to działa dla mnie

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

OP pyta o ciągi chociaż. Nie daty. – Fogmeister

4

Można spróbować tego kodu:

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 Jestem nowy w SO, jak mogę podświetlić fragment kodu tak jak Ty? Dzięki. – danypata

+0

Wybierz cały tekst, który chcesz przenieść do bloku kodu i kliknij przycisk {} na górze, obok strzałek pogrubionych i kursywy. – satheeshwaran