Domanda

ho un NSArray che contiene stringhe di date (cioè.NSString) come questo:"Gio 21 maggio 09 19:10:09 -07:00"

Devo ordinare il NSArray per data.Ho pensato di convertire la stringa della data in un file NSDate object prima, ma sono rimasto bloccato lì su come ordinare in base a NSDate oggetto.

Grazie.

È stato utile?

Soluzione

Conservare le date come oggetti NSDate in un array NS (Mutevole), quindi utilizzare -[NSArray sortedArrayUsingSelector: o -[NSMutableArray sortUsingSelector:] e superare @selector(compare:) come parametro. Il metodo -[NSDate compare:] ordinerà date in ordine crescente per voi. Questo è più semplice di creare un NSSortDescriptor, e molto più semplice che scrivere la propria funzione di confronto. (Oggetti NSDate sanno come si confrontano l'un l'altro, almeno nel modo più efficiente come abbiamo potuto sperare di ottenere con il codice personalizzato.)

Altri suggerimenti

Se ho un NSMutableArray di oggetti con un campo "BEGINDATE" di tipo NSDate Sto utilizzando un NSSortDescriptor come di seguito:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

Si può anche usare qualcosa come il seguente:

//Sort the array of items by  date
    [self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
        return [obj2.date compare:obj1.date];
    }];

Ma questo per scontato che la data è memorizzato come un NSDate piuttosto una NString , che dovrebbe essere un problema per fare / fare. Preferibilmente, consiglio anche memorizzare i dati in esso è formato grezzo. Rende più facile da manipolare in situazioni come questa.

È possibile utilizzare i blocchi per ordinare al suo posto:

sortedDatesArray = [[unsortedDatesArray sortedArrayUsingComparator: ^(id a, id b) {
    NSDate *d1 = [NSDate dateWithString: s1];
    NSDate *d2 = [NSDate dateWithString: s2];
    return [d1 compare: d2];
}];

Vi suggerisco di convertire tutte le stringhe di date prima della cernita di non fare la conversione più volte di quanto non ci sono elementi di data. Qualsiasi algoritmo di ordinamento vi darà più stringa per conversioni di data rispetto al numero di elementi nella matrice (a volte sostanzialmente più)

un po 'più su blocchi di ordinamento: http: // sokol8 .blogspot.com / 2011/04 / cernita NSArray-con-blocks.html

Ciò che ha funzionato nel mio caso è stato il seguente:

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

Avevo un dizionario, dove tutte le chiavi avevano le date nel formato gg-MM-aaaa.E allKeys restituisce le chiavi del dizionario non ordinate e volevo presentare i dati in ordine cronologico.

È possibile utilizzare sortedArrayUsingFunction:context: . Ecco un esempio:

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

Quando si utilizza un NSMutableArray, è possibile utilizzare sortArrayUsingFunction:context: .

Una volta che avete un NSDate, è possibile creare un NSSortDescriptor con initWithKey:ascending: e quindi utilizzare sortedArrayUsingDescriptors: per fare l'ordinamento.

Modificare questo

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

Per

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

Basta modificare la chiave: deve essere sempre Date

Swift 3.0

myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
scroll top