2010-08-02 5 views

Répondre

1

Merci de votre aide.

localizedCaseInsensitiveCompare

cette API fera le tri par rapport à la localisation. Sinon, les chaînes de langues différentes seront traitées comme des chaînes Unicode et la comparaison échouera.

Voici la solution:

NSComparisonResult sortLocationsForStr(NSString* str1, NSString* str2, void *context) 
{ 
    return [str1 localizedCaseInsensitiveCompare:str2]; 
} 

[myArrayToSort sortUsingFunction:sortLocationsForStr context:nil]; 
+0

Vous devez utiliser l'algorithme Unicode Collation. – tchrist

3

Toutes les chaînes d'Objective-C (NSString *) sont des chaînes Unicode. Ce sont des séquences de caractères Unicode (par opposition aux séquences d'octets codés). Vous pouvez trier un tableau de chaînes en utilisant les méthodes fournies par NSArray.

NSArray* myArray = [NSArray arrayWithObjects:@"はじめまして", @"русский язык", @"คนอ้วน ๆ", nil]; 

NSArray* mySortedArray = [myArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 

Cela trier les chaînes par leur ordre unicode, si vous avez une autre condition de tri puis fournir un sélecteur de tri personnalisé ou élaborer votre question.

+1

Que voulez-vous "dans leur ordre Unicode"? Vous voulez dire dans l'ordre défini par l'algorithme Unicode Collation? Ce serait l'ordre Unicode. Si vous voulez dire un ordre de point de code, c'est de la pure ordure et ne produit pas un tri alphabétique. – tchrist

+0

@tchrist: +1. Je suis d'accord que trier sur l'ordre des points n'est pas significatif. Cependant, la question ne mentionne pas du tout «ordre alphabétique». Pour tout ce que je sais, ils voulaient un tableau trié arbitrairement pour la recherche binaire? Je les ai encouragés à élaborer leur question et j'aurais élaboré ma réponse. Peut-être pourriez-vous créer une réponse expliquant comment utiliser l'algorithme Unicode Collation dans Objective-C? – Akusete

1

Si vous voulez trier en utilisant les descripteurs de tri, vous pouvez également trier comme ceci:

NSSortDescriptor *sorter = [NSSortDescriptor descriptorWithKey:@"description" ascending:YES]; 
NSArray* mySortedArray = [myArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sorter]]; 

« description » OK fonctionne comme une clé pour les valeurs NSString, étant donné que la description est documentée pour se retourner. L'avantage de la route NSSortDescriptor est que vous pouvez avoir plus d'un descripteur de tri, ou vous pouvez choisir d'utiliser un tri décroissant à la place.

+0

Si vous souhaitez trier un tableau de NSStrings avec un descripteur de tri, il est probablement préférable d'utiliser 'self' comme clé. http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/doc/uid/20000052-BBCGEBBJ – JeremyP

+1

pour NSString, "description" est équivalent en ce qu'il renvoie toujours l'objet NSString lui-même. Je pense que c'est moins déroutant que "self" qui pourrait être mal interprété comme étant la classe faisant l'appel et non les objets dans le tableau ... –

Questions connexes