iphone - Je veux trier un tableau en utilisant NSSortDescriptor



nsarray jquery-ui-sortable (5)

J'ai un problème concernant le tri d'une base de données de tableau wrt:

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 il ne me montre pas la sortie triée correctement. Ici, je trier un tableau avec rt "w" qui est ma colonne de la table dans la base de données. Ici, j'ai joint la capture d'écran pour la sortie, qui dit que "Cancer" vient en premier que "c", mais ce n'est pas correct, il ne donne pas de tri alphabétique en raison des mots en majuscules.

par exemple. s'il y a "capable" en minuscule et "aCid" alors il montrera aCid d'abord puis ensuite, et il y a aussi un cas où si la 1ère lettre est majuscule, elle vient en premier, par exemple "Able" et "a". Ici, Able s'affiche en premier.

https://src-bin.com


Answer #1

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

Answer #2

Je pense que cela va faire l'affaire pour vous. Les documents pour cela sont ici: Guide de programmation de chaîne

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 que vous copiez 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

Answer #3

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

Cette méthode devrait être utilisée chaque fois que des noms de fichiers ou d'autres chaînes sont présentés dans des listes et des tables où le tri du Finder est approprié.Le comportement de tri exact de cette méthode est différent selon les paramètres régionaux et peut être modifié dans les prochaines versions.


Answer #4

Une forme alternative du tri finder d'Apple avec la méthode locale utilise le bloc comparateur, utile si vous êtes dans un environnement ARC et ne voulez pas faire face à des jets 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 aussi de stocker les paramètres régionaux actuels dans une variable locale à des fins d'efficacité.


Answer #5

Vous pouvez l'utiliser pour trier un tableau en fonction du nom qui contient également une 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 de trier le nom en fonction des alphabets qui ont aussi un petit caractère, c.-à-d. Rocky, Ajay, john, Bob etc.





sorting