71 votes

Je veux trier un tableau en utilisant NSSortDescriptor.

J'ai un problème concernant le tri d'un tableau par rapport à la base de données :

NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"w" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter]; 

[mGlossaryArray sortUsingDescriptors:sortDescriptors]; 
[sorter release];

Ici, dans la base de données, il y a quelques premières lettres majuscules et à cause de ces lettres majuscules, le résultat trié n'est pas correct. Ici, je trie un tableau avec r.t "w" qui est ma colonne de table dans la base de données. J'ai joint la capture d'écran de la sortie, qui dit que "Cancer" vient d'abord que "c", mais ce n'est pas correct, il ne donne pas le tri alphabétique en raison des mots en majuscules.

Par exemple, s'il y a "able" en minuscule et "aCid", aCid s'affichera en premier et ensuite able. Il y a aussi un cas où la première lettre est en majuscule et s'affiche en premier, par exemple "Able" et "a". Ici, Able s'affiche en premier. enter image description here

168voto

Hobbes the Tige Points 1575

Jetez un coup d'œil ici : Création et utilisation de descripteurs de tri

Vous pouvez comparer sans tenir compte de la casse.

NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]
          initWithKey:@"w"
          ascending:YES
          selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];

39voto

Light Points 159

Utilisez simplement NSSortDescriptor comme je l'ai fait et cela a bien fonctionné.

   NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];

5voto

Christian Kienle Points 734

Puis-je suggérer d'utiliser -localizedStandardCompare : (NSString) ?

"Cette méthode doit être utilisée chaque fois que des noms de fichiers ou d'autres chaînes de caractères sont présentés dans des listes et des tableaux où un tri de type Finder est approprié. Le comportement exact de tri de cette méthode est différent sous différentes locales et peut être modifié dans les prochaines versions."

3voto

Lalit Points 1037

Vous pouvez l'utiliser pour trier un tableau en fonction du nom qui contient aussi petite lettre :

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"w" ascending:YES selector:@selector(caseInsensitiveCompare:)];

NSArray *sortDescriptors = [NSArray arrayWithObject:sorter]; 

[mGlossaryArray sortUsingDescriptors:sortDescriptors];

Ce code fonctionne bien pour moi pour trier les noms selon les alphabets qui ont aussi un petit caractère, c'est-à-dire rocky, Ajay, john, Bob etc.

2voto

Ari Braginsky Points 525

Une forme alternative de la méthode finder sort with locale d'Apple utilise le bloc comparateur, utile si vous êtes dans un environnement ARC et que vous ne voulez pas vous occuper des casts de transition, etc :

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"your_string_key" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
    NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch;
    NSRange string1Range = NSMakeRange(0, ((NSString *)obj1).length);
    return [(NSString *)obj1 compare: (NSString *)obj2 options: comparisonOptions range: string1Range locale: [NSLocale currentLocale]];
}];

NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:@[sortDescriptor]];

Je recommanderais également de stocker la locale actuelle dans une variable locale pour des raisons d'efficacité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X