Question

J'ai un NSArray qui contient des chaînes de date (i.e. NSString.) comme ceci: "Jeu, 21 mai 09 19:10:09 -0700"

Je dois trier la NSArray par date. Je pensais à la conversion de la chaîne de date à un objet NSDate premier, mais suis resté coincé là-bas sur la façon de trier par l'objet NSDate.

Merci.

Était-ce utile?

La solution

Stocker les dates que les objets NSDate dans un NS (Mutable) Array, puis utilisez -[NSArray sortedArrayUsingSelector: ou href="https://developer.apple.com/documentation/foundation/nsmutablearray/1412273-sortusingselector?language=objc" rel="nofollow noreferrer"> -[NSMutableArray sortUsingSelector:] et passe @selector(compare:) comme paramètre. La méthode -[NSDate compare:] ordonnera dates dans l'ordre croissant pour toi. C'est plus simple que de créer un NSSortDescriptor, et beaucoup plus simple que d'écrire votre propre fonction de comparaison. (Objets NSDate savent comment se comparer les uns aux autres au moins aussi efficace que nous pouvions espérer accomplir avec un code personnalisé.)

Autres conseils

Si j'ai un NSMutableArray d'objets avec un champ « beginDate » de type NSDate J'utilise un NSSortDescriptor comme suit:

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

Vous pouvez également utiliser quelque chose comme ce qui suit:

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

Mais cela suppose que la date est stockée en tant que NSDate plutôt NString , qui devrait avoir aucun problème à faire / faire. De préférence, je vous recommande de stocker aussi les données dans son format brut. Il est plus facile à manipuler dans des situations comme celle-ci.

Vous pouvez utiliser des blocs pour trier en place:

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

Je vous suggère de convertir toutes vos chaînes dates avant le tri de ne pas faire la conversion fois plus que il y a des éléments de date. Tout algorithme de tri vous donnera plus de chaîne à des conversions de date que le nombre d'éléments dans le tableau (parfois beaucoup plus)

un peu plus sur des blocs de tri: http: // sokol8 .blogspot.com / 2011/04 / tri-NSArray avec-blocks.html

Qu'est-ce que cela a fonctionné dans mon cas était la suivante:

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

J'avais un dictionnaire, où toutes les clés où les dates au format JJ-MM-AAAA. Et AllKeys retourne les clés de dictionnaire non triés, et je voulais présenter les données dans l'ordre chronologique.

Vous pouvez utiliser sortedArrayUsingFunction:context: . Voici un exemple:

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

Lorsque vous utilisez un NSMutableArray, vous pouvez utiliser sortArrayUsingFunction:context: au lieu.

Une fois que vous avez un NSDate, vous pouvez créer un NSSortDescriptor avec initWithKey:ascending: puis utilisez sortedArrayUsingDescriptors: pour faire le tri.

Modifier cette

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

Pour

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

Il suffit de changer la clé: il faut toujours Date

Swift 3.0

myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top