web-dev-qa-db-fra.com

Je veux trier un tableau à l'aide de NSSortDescriptor

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.enter image description here

71
Prash.......

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]; 
168
Hobbes the Tige

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

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

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."

5
Christian Kienle

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.

3
Lalit Kumar Maurya

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:

  • c
  • cabine
  • café
  • Cancer
  • Chinois
  • Christianisme
  • Noël
  • Du Coca
2
Hobbes the Tige

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

2
Ari Braginsky

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];
}
2
Varsheen