web-dev-qa-db-fra.com

Comment trier un tableau de dates par ordre décroissant

J'ai un NSDictionary qui a été analysé dans un tableau dont l'un des éléments est la date. J'ai essayé d'utiliser [startimeArray sortUsingSelector:@selector(compare:)]; (starttimeArray), c'est ma date, mais elle ne fait qu'agrandir. Comment puis-je trier par ordre décroissant. Merci

15
baste

Triez le tableau en mettantNOest un paramètre croissant:

NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[dateArray sortedArrayUsingDescriptors:descriptors];
38
Anoop Vaidya

Vous pouvez utiliser un bloc comparateur

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
    return [d1 compare:d2];
}];

pour inverser l'ordre, il suffit d'échanger les dates

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
    return [d2 compare:d1];
}];

ou - comme compare: renvoie un NSComparisonResult, qui est en fait typé en entier voir ci-dessous - il suffit de multiplier par -1

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
    return -1* [d1 compare:d2];
}];

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
19
vikingosegundo

J'utiliserais la méthode reverseObjectEnumerator intégrée de NSArray

startimeArray = [startimeArray sortUsingSelector:@selector(compare:)];
startimeArray = [[startimeArray reverseObjectEnumerator] allObjects];

C'est utile lorsque vous avez besoin que le tableau soit trié par ordre croissant et décroissant, afin de pouvoir facilement revenir au tri précédent.

2
sarbuLopex

Swift 3.0

Pour ceux qui utilisent Swift 3.0, ce DateHelper vous évitera des maux de tête.

   filteredLogs.sort(by: {
        let firstElement = $0.timeStamp! as Date
        let secondElement = $1.timeStamp! as Date
        return firstElement.compare(.isEarlier(than: secondElement))
    })

Le code ci-dessus est un extrait de l'un de mes projets. Il utilise la classe d'assistance pour trier mes journaux avec les dates les plus récentes à gauche du tableau. Le signe $ est un paramètre de position

1
Daniel

Il y a la solution Swift pour la solution vérifiée:

let sortedArray = randomArray.sortedArrayUsingComparator { (d1, d2) -> NSComparisonResult in
    return (d1 as! NSDate).compare(d2 as! NSDate)
}
1
Kevin ABRIOUX

Dans la classe où les éléments de tableau sont en cours d'initialisation.

-(NSComparisonResult) compareArray: (id) element {
    Return [ArrayElement compare: [element ArrayElement]];
}



-(NSComparisonResult) compareArrayReverse: (id) element {
    Return [[element ArrayElement] compare: ArrayElement];
}

Puis dans la classe où votre startimeArray est initialisé: 

@synthesize ArrayName;


-(void) sort: (BOOL) sel {
    if (sel) {
        [ArrayName sortUsingSelector: @selector(compareArray:)];
    } else {
        [ArrayName sortUsingSelector: @selector(compareArrayReverse:)];
    }    
}

Puis dans la main ():

// Sort the array. sort = TRUE - ascending order, sort = FALSE - descending order.

[startimeArray sort: FALSE];
0
jacai