2010-12-11 40 views
0

J'ai un NSArray d'objets. Chaque objet a plusieurs propriétés. Par exemple: Le NSArray oneArray a 5 objets. Chaque objet a les propriétés suivantes: name, address, ZIP_Code.Comment trier un NSArray avec des objets

Comment puis-je trier le NSArray, par name?

+0

dupliquer? http://stackoverflow.com/questions/2849911/sorting-a-nsarray –

Répondre

4
NSSortDescriptor* dx = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
NSSortDescriptor* dy = [[NSSortDescriptor alloc] initWithKey:@"address" ascending:NO selector:@selector(caseInsensitiveCompare:)]; 
[arr sortUsingDescriptors:[NSArray arrayWithObjects:dx, dy, nil]]; 
[dx release]; 
[dy release]; 

Taken à partir du code posté par KennyTM. Édité par Jordan pour fonctionner réellement;) Remplacer Array arr avec votre tableau. Modifier pour convenir.

+0

+1 notez que cela ne fonctionne que si 'arr' est un' NSMutableArray'. Si 'arr' est un' NSArray', alors vous devez utiliser '-sortedArrayUsingDescriptors:' et capturer la valeur de retour. –

+0

Correct. Merci Dave. – Jordan

1
NSInteger nameSort(id obj1, id obj2, void *context) 
    { 
     NSComparisonResult result = [obj1.name compare:obj2.name]; 

     if (result == NSOrderedAscending) // stringOne < stringTwo 
      return NSOrderedAscending; 

     if (result == NSOrderedDescending) // stringOne > stringTwo 
      return NSOrderedDecending; 

     if (result == NSOrderedSame) // stringOne == stringTwo 
      return NSOrderedSame; 
    } 
/*to sort oneArray*/ oneArray = [oneArray sortedArrayUsingFunction:nameSort context:NULL]; 
+0

Ces ifs sont inutiles, il suffit de retourner 'result'. – dreamlax

1

J'aime la réponse de Jordan parce que (1) je ne connaissais pas NSSortDescriptor et (2) il est utile pour trier sur plusieurs propriétés.

Mais ce que je fais habituellement est de créer une méthode comme -(NSComparisionResult)compare:(MyClass*)otherObject dans ma classe, puis d'utiliser -[myArray sortedArrayUsingSelector:@selector(compare:)]. La méthode de comparaison elle-même est similaire à la réponse de Jumhyn, mais je pense qu'elle est un peu plus propre car la classe elle-même compare les objets, au lieu d'une fonction autonome.

+0

+1 pour votre réponse! Votre idée aussi géniale. Ceci est similaire au comparateur en Java! –