2 votes

Alternatives à caseInsensitiveCompare sortDescriptor

Un tableau à trier contient des chaînes de caractères telles que :

200burgers
1apple
2burgers
11apples

et similaires. En triant de manière ascendante avec caseInsenstive, j'obtiens :

11apples
1apple
200burgers
2burgers

Ce qui est logique, mais je préférerais un tri lexicographique qui mettrait "1" avant "10", "10" avant "100", &c., comme par exemple :

1apple
11apples
2burgers
200burgers

Dois-je construire un comparateur personnalisé ou existe-t-il une autre option ?

1voto

Wevah Points 17636

Je pense que vous aurez probablement besoin d'un comparateur personnalisé, mais ce serait quelque chose de très simple :

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES comparator:^(id one, id two) {
    return [one compare:two options:NSCaseInsensitiveSearch | NSNumericSearch];
}];

0voto

EricLeaf Points 723

Si vous ne pouvez pas ajuster la chaîne de caractères, vous devrez écrire un comparateur personnalisé pour rechercher dans la chaîne de caractères ce qui n'est pas un chiffre et trier sur la partie chaîne de caractères puis sur la partie numéro.

Cependant, il serait beaucoup plus facile d'avoir ces deux éléments en tant qu'objets distincts et d'utiliser la fonction - (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors

Où vous allez trier sur "string" et ensuite "count". Lexicalement, les chiffres ne seront pas triés correctement dans la forme concaténée que vous avez affichée.

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