Ordenar NSArray de las cadenas de fecha u objetos
-
16-09-2019 - |
Pregunta
Tengo una NSArray
que contiene las cadenas de fecha (es decir NSString.) como esto: "Jue 21 May 09 19:10:09 -0700"
necesito para ordenar la NSArray
por fecha. Pensé en la conversión de la cadena de fecha a un objeto NSDate
principio, pero quedé atrapado allí en la forma para ordenar por objeto NSDate
.
Gracias.
Solución
Almacenar las fechas como objetos NSDate
en una matriz NS (mutable), a continuación, utilizar -[NSArray sortedArrayUsingSelector: o href="https://developer.apple.com/documentation/foundation/nsmutablearray/1412273-sortusingselector?language=objc" rel="nofollow noreferrer"> -[NSMutableArray sortUsingSelector:]
y pasar @selector(compare:)
como parámetro. El método -[NSDate compare:]
ordenará fechas en orden ascendente tú. Esto es más simple que la creación de un NSSortDescriptor
, y mucho más sencillo que escribir su propia función de comparación. (Objetos NSDate
saben cómo comparar el uno al otro por lo menos tan eficientemente como lo que podría esperar lograr con código personalizado.)
Otros consejos
Si tengo una NSMutableArray
de objetos con un campo "BeginDate" del tipo NSDate
Estoy utilizando un NSSortDescriptor
como a continuación:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
También puede usar algo como lo siguiente:
//Sort the array of items by date
[self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj2.date compare:obj1.date];
}];
Pero esto asume que la fecha se almacena como un NSDate
más bien una NString
, que debería haber ningún problema para hacer / hacer. Preferiblemente, también recomiendo almacenar los datos en su formato en bruto. Hace que sea más fácil de manipular en situaciones como esta.
Puede utilizar bloques que ordenan en su lugar:
sortedDatesArray = [[unsortedDatesArray sortedArrayUsingComparator: ^(id a, id b) {
NSDate *d1 = [NSDate dateWithString: s1];
NSDate *d2 = [NSDate dateWithString: s2];
return [d1 compare: d2];
}];
Sugiero a convertir todos sus cadenas de fechas antes de la clasificación no se debe hacer la conversión más veces de las que hay elementos de fecha. Cualquier algoritmo de ordenación le dará más cuerda para conversiones de fecha que el número de elementos de la matriz (a veces mucho mejor)
un poco más sobre bloques de clasificación: http: // sokol8 .blogspot.com / 2011/04 / clasificación-NSArray-con-blocks.html
Lo que funcionó en mi caso fue la siguiente:
NSArray *aUnsorted = [dataToDb allKeys]; NSArray *arrKeys = [aUnsorted sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"dd-MM-yyyy"]; NSDate *d1 = [df dateFromString:(NSString*) obj1]; NSDate *d2 = [df dateFromString:(NSString*) obj2]; return [d1 compare: d2]; }];
Yo tenía un diccionario, donde todas las teclas donde las fechas en formato dd-mm-aaaa. Y AllKeys devuelve las claves de diccionario sin clasificar, y quería presentar los datos en orden cronológico.
Puede utilizar sortedArrayUsingFunction:context:
. Este es un ejemplo:
NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
NSDate *d1 = [NSDate dateWithString:s1];
NSDate *d2 = [NSDate dateWithString:s2];
return [d1 compare:d2];
}
NSArray *sorted = [unsorted sortedArrayUsingFunction:dateSort context:nil];
Cuando se utiliza un NSMutableArray
, puede utilizar sortArrayUsingFunction:context:
su lugar.
Una vez que tenga un NSDate
, se puede crear un NSSortDescriptor
con initWithKey:ascending:
y luego usar sortedArrayUsingDescriptors:
hacer la clasificación.
Cambiar esto
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
a
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
Sólo cambia la clave: se debe Date
siempre
Swift 3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })