2010-12-04 56 views
11

J'ai un NSArray d'objets NSDate et je veux les trier, de sorte qu'aujourd'hui est à 0, hier à 1 etc.tri NSArray de NSDates

est-il ascendant ou descendant, et dois-je utiliser une fonction, sélecteur ou quoi?

Répondre

37

Il existe différentes méthodes de tri pour NSArray car il existe différentes manières de trier les éléments. NSSortDescriptors est un moyen général qui vous donne beaucoup d'options en ce qui concerne les clés à utiliser dans le tri, les sélecteurs que vous voulez utiliser sur ces touches, et l'ordre général à utiliser, etc. Ou vous pouvez utiliser des fonctions ou des blocs comparateurs à la place si votre cas l'exige ou si c'est plus pratique pour votre cas particulier.

Pour répondre à votre première question, si vous voulez aujourd'hui être le premier, suivi par hier alors, oui, c'est bien sûr l'ordre décroissant.

Pour trier quelques dates dans l'ordre décroissant, vous pouvez simplement faire ceci: (en supposant un NSArray plein de NSDates appelé 'dateArray'):

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO]; 
NSArray *descriptors = [NSArray arrayWithObject: descriptor]; 
[descriptor release]; 

NSArray *reverseOrder = [dateArray sortedArrayUsingDescriptors:descriptors]; 

Ou, si vous construisez pour iOS 4+ ou Snow Leopard + vous pouvez le faire:

NSArray *reverseOrderUsingComparator = [dateArray sortedArrayUsingComparator: 
             ^(id obj1, id obj2) { 
              return [obj2 compare:obj1]; // note reversed comparison here 
             }]; 
-1

Essayez cette magie:

tableau de tri des dates dans l'ordre croissant.

c.-à-d., Dates arrivant plus tard et plus tard, ou pour le dire autrement, dates à venir dans le futur.

NSArray ascendingDates = [dates sortedArrayUsingSelector:@selector(compare:)]; 

tableau de tri des dates dans l'ordre décroissant. (ce que la question posée)

à savoir les dates obtenir plus en plus tôt, les dates d'entrer dans le passé ou le mettre une autre façon: aujourd'hui est à l'index 0, hier à l'index 1.

NSArray* descendingDates = [[[dates sortedArrayUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects];