J'ai un NSArray
qui contient des chaînes de date (c'est-à-dire NSString) comme ceci: "Thu, 21 May 09 19:10:09 -0700"
J'ai besoin de trier NSArray
par date. J'ai d'abord pensé à convertir la chaîne de date en NSDate
objet, mais je suis resté coincé sur la façon de trier par NSDate
objet.
Merci.
Réponses:
Stockez les dates en tant
NSDate
qu'objets dans un tableau NS (mutable), puis utilisez-[NSArray sortedArrayUsingSelector:
ou-[NSMutableArray sortUsingSelector:]
et passez@selector(compare:)
comme paramètre. La-[NSDate compare:]
méthode classera les dates par ordre croissant pour vous. C'est plus simple que de créer unNSSortDescriptor
, et beaucoup plus simple que d'écrire votre propre fonction de comparaison. (lesNSDate
objets savent comment se comparer les uns aux autres au moins aussi efficacement que nous pourrions espérer le faire avec du code personnalisé.)la source
Si j'ai un
NSMutableArray
des objets avec un champ "beginDate" de type,NSDate
j'utilise unNSSortDescriptor
comme ci-dessous:NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
la source
-[NSMutableArray sortUsingComparator:]
(10.6+) et passer un bloc qui renvoie le résultat de l'appel-compare:
sur les deux champs. Ce serait probablement plus rapide que d'appeler-valueForKey:
chaque objet. Vous pouvez même utiliser-sortWithOptions:usingComparator:
et transmettre des options pour trier simultanément.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
NSDate
plutôt comme unNString
, ce qui ne devrait pas poser de problème à faire / à faire. De préférence, je recommande également de stocker les données dans leur format brut. Facilite la manipulation dans des situations comme celle-ci.la source
Vous pouvez utiliser des blocs pour trier sur 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 en dates avant de trier pour ne pas faire la conversion plus de fois qu'il n'y a d'éléments de date. Tout algorithme de tri vous donnera plus de conversions de chaîne à date que le nombre d'éléments dans le tableau (parfois beaucoup plus)
un peu plus sur le tri des blocs: http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html
la source
Ce qui a fonctionné dans mon cas était le suivant:
J'avais un dictionnaire, où toutes les clés où les dates au format jj-MM-aaaa. Et allKeys renvoie les clés du dictionnaire non triées, et je voulais présenter les données dans l'ordre chronologique.
la source
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 a
NSMutableArray
, vous pouvez utiliser à lasortArrayUsingFunction:context:
place.la source
NSDate
objets, vous pouvez utiliser ma réponse ci-dessus, ou même utiliser-[NSMutableArray sortUsingComparator:]
, qui a été ajoutée dans 10.6.Une fois que vous avez un
NSDate
, vous pouvez créer unNSSortDescriptor
avecinitWithKey:ascending:
, puis l'utilisersortedArrayUsingDescriptors:
pour effectuer le tri.la source
Swift 3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
la source
Change ça
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
À
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE]; [myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; [sortDescriptor release];
Changez simplement la CLE: elle doit
Date
toujours êtrela source