J'ai un NSArray
qui contient des chaînes de date (c.-à-d. NSString) comme ceci: "Jeu 21 mai 09 19:10:09 -0700"
J'ai besoin de trier les NSArray
par date. J'ai d'abord pensé à convertir la chaîne de date en un objet NSDate
, mais je suis resté bloqué sur la façon de trier par l'objet NSDate
.
Merci.
Stockez les dates en tant qu'objets NSDate
dans un tableau NS (Mutable), puis utilisez -[NSArray sortedArrayUsingSelector:
ou -[NSMutableArray sortUsingSelector:]
et passez @selector(compare:)
comme paramètre. La méthode -[NSDate compare:]
classera les dates 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
les objets savent se comparer les uns aux autres au moins aussi efficacement que nous pourrions espérer accomplir avec du code personnalisé.)
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];
Vous pouvez également utiliser quelque chose comme ceci:
//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 que NString
, ce qui ne devrait pas poser de problème pour 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.
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 les trier pour ne pas effectuer 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înes en 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
Ce qui a fonctionné dans mon cas était le suivant:
NSArray * aUnsorted = [dataToDb allKeys]; NSArray * arrKeys = [aUnsorted sortedArrayUsingComparator: ^ NSComparisonResult (id obj1, id obj2) { NSDateFormatter * df = [[NSDateFormatter] .____.] [df setDateFormat: @ "jj-MM-aaaa"]; NSDate * d1 = [df dateFromString: (NSString *) obj1]; NSDate * d2 = [df dateFromString : (NSString *) obj2]; Renvoie [d1 compare: d2]; ;
J'avais un dictionnaire, où toutes les clés étaient des 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.
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:
à la place.
Une fois que vous avez un NSDate
, vous pouvez créer un NSSortDescriptor
avec initWithKey:ascending:
puis utilisez sortedArrayUsingDescriptors:
pour faire le tri.
Swift 3.
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
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];
Il suffit de changer la CLÉ: elle doit être Date
toujours