2010-10-06 10 views
0

J'ai fait une classe personnalisée. Ceci est le fichier hComment faire pour modifier ce code afin que le NSMutableArray soit trié?

@interface Player : NSObject { 
    NSString *name; 
    NSNumber *points; 
} 

@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSNumber *points; 

-(id) initWithName:(NSString *)n andPoints:(int)p; 

@end 

Ceci est le fichier m

#import "Player.h" 

@implementation Player 
@synthesize name, points; 

-(id) initWithName:(NSString *)n andPoints:(int)p 
{ 
    self.name = n; 
    self.points = [NSNumber numberWithInt:p]; 
    return self; 
} 
@end 

Puis-je créer plusieurs joueurs, et les attribuer à l'une des deux équipes comme celle-ci:

Player *p1 = [[Player alloc] initWithName:@"Joe" andPoints:5]; 
Player *p2 = [[Player alloc] initWithName:@"James" andPoints:5]; 
Player *p3 = [[Player alloc] initWithName:@"Jim" andPoints:5]; 

NSMutableArray *team1 = [[NSMutableArray alloc] initWithObjects:p1,p2,p3,nil]; 

Player *p4 = [[Player alloc] initWithName:@"Aaron" andPoints:7]; 
Player *p5 = [[Player alloc] initWithName:@"Anthony" andPoints:7]; 
Player *p6 = [[Player alloc] initWithName:@"Alex" andPoints:7]; 

NSMutableArray *team2 = [[NSMutableArray alloc] initWithObjects:p4,p5,p6,nil]; 

Je mettre ces deux équipes dans un autre NSMutableArray comme ceci:

NSMutableArray *allTeams = [[NSMutableArray alloc] initWithObjects:team1, team2, nil]; 

Pour afficher tous les joueurs et leurs points, j'utilise cette boucle:

for (NSMutableArray *teamArray in allTeams) { 
    for (Player *player in teamArray) { 
     NSLog(@"%@: %@", [player name], [player points]); 
    } 
} 

Comme il est, il va juste montrer les joueurs dans l'ordre dans lequel ils sont ajoutés au-dessus.

Je veux trier ce tableau d'équipes en fonction des points de l'équipe, ce qui est juste la somme des points de chaque joueur de l'équipe. Ensuite, lorsque la boucle se déroule pour afficher tous les joueurs, les joueurs de team2 seront affichés avant team1.

Quel est le code pour trier le tableau allTeams par points d'équipe? Ai-je besoin d'utiliser des catégories?

Répondre

4

En fait, ça va être très simple. A faire:

[allTeams sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"@sum.points" ascending:NO]]]; 

Espérons que cela soit sorti correctement. Il est difficile de taper du code sur un iPhone ...

+2

A l'arrière, l'opérateur de tableau vient en premier donc @ sum.points :) Notez également que la méthode de commodité de classe n'est disponible que sur iOS 4.0+, donc il va se bloquer sur le courant iPads. –

+0

Génial, merci! Le tri par nombre de joueurs est-il aussi facile? –

+0

@awakeFromNib oui, utilisez '@ count' au lieu de' @ sum' –