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.

¿Fue útil?

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 })
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top