J'ai un problème concernant le tri d'une base de données array w.r.t:
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 cette lettre majuscule, elle ne me montre pas une sortie triée appropriée. Ici, je trie un tableau avec r.t "w" qui est ma colonne de table dans la base de données. Ici, j'ai attaché la capture d'écran pour la sortie, qui dit que "Cancer" vient en premier "C", mais ce n'est pas correct, il ne donne pas de tri alphabétique à cause des mots en majuscule.
par exemple. s'il y a "capable" en minuscules et "aCid" alors il montrera aCid d'abord et ensuite capable, et il y a aussi un cas où si la 1ère lettre est en majuscule, elle vient en premier par exemple, "Able" et "a". Ici, Able s'affiche en premier.
Jetez un œil ici: Création et utilisation de descripteurs de tri
Vous pouvez comparer comme insensible à la casse.
NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]
initWithKey:@"w"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];
Utilisez simplement NSSortDescriptor comme je l'ai utilisé et cela a bien fonctionné.
NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
Puis-je suggérer d'utiliser -localizedStandardCompare: (NSString)?
"Cette méthode doit être utilisée chaque fois que les noms de fichiers ou d'autres chaînes sont présentés dans des listes et des tableaux où le tri de type Finder est approprié. Le comportement de tri exact de cette méthode est différent selon les paramètres régionaux et pourra être modifié dans les versions futures."
Vous pouvez l'utiliser pour trier un tableau selon un nom qui contient également minuscule:
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 le nom en fonction d'alphabets qui ont également un petit caractère, c'est-à-dire rocheux, Ajay, john, Bob, etc.
Je pense que cela fera l'affaire pour vous. Les documents pour cela sont ici: Guide de programmation des chaînes
Ajoutez cette petite fonction écrite par Apple.
int finderSortWithLocale(id string1, id string2, void *locale)
{
static NSStringCompareOptions comparisonOptions =
NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2
options:comparisonOptions
range:string1Range
locale:(NSLocale *)locale];
}
Assurez-vous de copier la définition de la fonction dans votre en-tête, sinon vous obtiendrez une erreur de compilation sur votre tableau trié.
Pour votre tableau trié, utilisez cette méthode:
[mGlossaryArray sortedArrayUsingFunction:finderSortWithLocale context:[NSLocale currentLocale]];
Vos résultats ressembleront à ceci:
Une autre forme de tri du Finder d'Apple avec la méthode locale utilise le bloc de comparaison, utile si vous êtes dans un environnement ARC et que vous ne voulez pas gérer les transitions de pontage, 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 les paramètres régionaux actuels dans une variable locale à des fins d'efficacité.
Ce code fonctionne bien pour moi.
- (void)sortSearchResultWithInDocumentTypeArray:(NSMutableArray *)aResultArray basedOn:(NSString *)aSearchString {
NSSortDescriptor * frequencyDescriptor =[[NSSortDescriptor alloc] initWithKey:aSearchString ascending:YES comparator:^(id firstDocumentName, id secondDocumentName) {
static NSStringCompareOptions comparisonOptions =
NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
return [firstDocumentName compare:secondDocumentName options:comparisonOptions];
}];
NSArray * descriptors = [NSArray arrayWithObjects:frequencyDescriptor, nil];
[aResultArray sortUsingDescriptors:descriptors];
}