web-dev-qa-db-fra.com

Trier NSArray des chaînes de date ou des objets

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.

83
postalservice14

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é.)

109
Quinn Taylor

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

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.

16
TheCodingArt

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

9

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.

5
notnoop

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

4
smorgan

Swift 3.

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

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

1
user2339385