2013-04-25 8 views
6

Ho bisogno di ordinare un NSArray contenenti tempo s NSString' quali,iOS sorta una NSArray del Tempo NSString di

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

Che cosa ho bisogno è quello di ordinare l'array in ordine crescente di tempo.
C'è un modo per fare una cosa del genere?

+0

vedere questa risposta http://stackoverflow.com/questions/1132806/sort-nsarray-of-date-strings -or-objects/1134126 # 1134126 –

risposta

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

versione ottimizzata:

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

Aggiunta una modifica. La seconda versione sembra essere migliore perché con l'uso di meno conversioni NSString/NSDate. – filwag

3

in quanto questi sono stringhe sarà sored come

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

E non sono neanche NSDate.

Quindi è necessario che crei un array parallelo che dispone di NSDate da queste stringhe, ordina l'array ed estrae questi valori.


Mentre attuazione ho risolto da novizio vie

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

mi ricorda come prima le recenti date di ridisegno del portale sviluppatore iOS sulla pagina "Cronologia dispositivi" sono state ordinate alfabeticamente: http://i.imgur.com/3ePRr.png – Kreiri

0

Per NSDate Confronto utilizzare questo:

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

Quindi, se non si desidera convertire le ore di NSDate fanno da solo funziona per me

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

L'OP chiede di stringhe anche se. Non date. – Fogmeister

4

Si può provare questo codice:

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 Sono nuovo di SO, come posso evidenziare lo snippet di codice come hai fatto tu? Grazie. – danypata

+0

Seleziona tutto il testo che vuoi spostare nel blocco di codice e fai clic su {} in alto, vicino ai pulsanti Grassetto, Corsivo. – satheeshwaran

Problemi correlati