2010-10-21 11 views
3

Alors, imaginez que vous avez deux ou trois tableaux, couleurs et formes, comme ceci:Tri NSArray en utilisant un autre NSArray comme guide

Colors: { 
Yellow, 
Blue, 
Red 
} 

Shapes: { 
Square, 
Circle, 
Diamond 
} 

Maintenant, si je veux trier les couleurs dans l'ordre alphabétique que je peux faire Quelque chose comme ceci:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES selector:@selector(localizedCompare:)]; 
NSArray *sortedColors = [colors sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
[sortDescriptor release]; 

Mais comment pourrais-je trier les formes dans le même ordre que j'ai re-commandé des couleurs. Je ne veux pas dire mettre des formes dans l'ordre alphabétique - je veux dire mettre des formes dans l'ordre alphabétique des couleurs ...?

Répondre

9

probablement plus simple est celle-ci:

NSDictionary *dict = [NSDictionary dictionaryWithObjects:colors forKeys:shapes]; 
NSArray *sortedShapes = [dict keysSortedByValueUsingSelector:@selector(localizedCompare:)]; 
+1

La réponse de dreamlax est certainement la solution «plus propre» et plus générale (fonctionne avec n'importe quel nombre de baies, pas seulement deux). Je pense à celui-ci comme plus d'un hack rapide. –

1

Si les couleurs sont jumelés avec les tableaux, peut-être vous devriez envisager d'utiliser un seul tableau au lieu de deux. Par exemple, vous pouvez structurer vos données de manière à pouvoir interroger la forme et la couleur d'un objet à l'aide d'un seul index. Il y a au moins quelques façons d'y parvenir.

  1. utiliser un tableau de dictionnaires, chaque dictionnaire contient deux paires clé-valeur, ShapeKey et ColourKey. Une fois que vous avez créé cette structure, vous pouvez utiliser:

    NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"ColourKey" ascending:YES]; 
    NSArray *sortedByColours = [colours sortedArrayUsingDescriptors:[NSArray arrayWithObject:sd]; 
    [sd release]; 
    
  2. Définition d'une classe personnalisée avec deux propriétés, colour et shape. Si vous utilisez cette approche, vous pouvez utiliser le code ci-dessus, mais simplement remplacer @"ColourKey" par @"colour" (ou ce que vous avez choisi d'appeler cette propriété).

Si vous insistez sur le maintien de deux tableaux distincts, allez avec la réponse de Dickison ' @ Daniel.