86 votes

NSArray tri de chaînes de date ou d’objets

J'ai un NSArray qui contient des chaînes de date comme celle-ci: "Jeu, 21 mai 09 19:10:09 -0700"

Je dois trier les NSArray par date. J'ai d'abord pensé à convertir la chaîne de date en un objet NSDate , mais je me suis retrouvé coincé sur la façon de trier l'objet NSDate .

Merci.

115voto

vinzenzweber Points 2339

Si j'ai un NSMutableArray d'objets avec un champ "beginDate" de type NSDate j'utilise un NSSortDescriptor comme ci-dessous:

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

110voto

Quinn Taylor Points 29688

Stocker les dates que NSDate objets dans un NS(Mutable)Array, puis utilisez -[NSArray sortedArrayUsingSelector: ou -[NSMutableArray sortUsingSelector:] et passent @selector(compare:) en tant que paramètre. L' -[NSDate compare:] méthode les dates de commande dans l'ordre croissant pour vous. C'est plus simple que de créer un NSSortDescriptor, et beaucoup plus simple que d'écrire votre propre fonction de comparaison. (NSDate objets de savoir comment se comparent les uns aux autres au moins aussi efficace que nous avons pu accomplir grâce à un code personnalisé.)

17voto

TheGamingArt Points 692

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 sous forme de date plutôt que de chaîne, ce qui ne devrait poser aucun problème pour faire / faire. De préférence, je recommande également de stocker les données dans son format brut. Le rend plus facile à manipuler dans des situations comme celle-ci.

10voto

Vous pouvez utiliser des blocs de ce genre:

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 de dates avant le tri de ne pas faire la conversion plus de fois qu'il y a des éléments de date. Tout algorithme de tri qui vous donnera plus de chaîne à la date de conversions que le nombre d'éléments dans le tableau (parfois beaucoup plus)

un peu plus sur les blocs de tri: http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html

5voto

notnoop Points 30218

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

Lors de l'utilisation d'un NSMutableArray, vous pouvez utiliser sortArrayUsingFunction:context: à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X