2010-05-04 20 views
6

Actualmente estoy usando NSMutableArrays en mis desarrollos para almacenar algunos datos tomados de un Servlet HTTP.Objetivo-C: Ordenar NSMutableArray que contiene NSMutableArrays

Todo está bien ya que ahora tengo que ordenar lo que está en mi matriz.

Esto es lo que hago:

NSMutableArray *array = [[NSMutableArray arrayWithObjects:nil] retain]; 
[array addObject:[NSArray arrayWithObjects: "Label 1", 1, nil]]; 
[array addObject:[NSArray arrayWithObjects: "Label 2", 4, nil]]; 
[array addObject:[NSArray arrayWithObjects: "Label 3", 2, nil]]; 
[array addObject:[NSArray arrayWithObjects: "Label 4", 6, nil]]; 
[array addObject:[NSArray arrayWithObjects: "Label 5", 0, nil]]; 

La primera columna contiene una etiqueta y la segunda es una puntuación Quiero que el array a ordenar descendente.

¿La forma en que estoy almacenando mis datos es buena? ¿Hay una mejor manera de hacerlo que usando NSMutableArrays en NSMutableArray?

Soy nuevo en el desarrollo de iPhone, he visto algunos códigos sobre clasificación pero no me siento bien con eso.

¡Gracias de antemano por sus respuestas!

+1

Esto no es un error en sí, pero no es un buen estilo de decir '[[NSMutableArray arrayWithObjects: nil] retener] '. En su lugar, debe usar '[NSMutableArray initWithObjects: nil]'. –

+0

En realidad, solo debe usar '[[NSMutableArray alloc] init]'. –

+0

O '[NSMutableArray array]'. –

Respuesta

10

Esto sería mucho más fácil si creara un objeto personalizado (o al menos use un NSDictionary) para almacenar la información, en lugar de usar una matriz.

Por ejemplo:

//ScoreRecord.h 
@interface ScoreRecord : NSObject { 
    NSString * label; 
    NSUInteger score; 
} 
@property (nonatomic, retain) NSString * label; 
@property (nonatomic) NSUInteger score; 
@end 

//ScoreRecord.m 
#import "ScoreRecord.h" 
@implementation ScoreRecord 
@synthesize label, score; 

- (void) dealloc { 
    [label release]; 
    [super dealloc]; 
} 

@end 

//elsewhere: 
NSMutableArray * scores = [[NSMutableArray alloc] init]; 
ScoreRecord * first = [[ScoreRecord alloc] init]; 
[first setLabel:@"Label 1"]; 
[first setScore:1]; 
[scores addObject:first]; 
[first release]; 
//...etc for the rest of your scores 

Una vez que haya rellenado su gama scores, ahora se puede hacer:

//the "key" is the *name* of the @property as a string. So you can also sort by @"label" if you'd like 
NSSortDescriptor * sortByScore = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES]; 
[scores sortUsingDescriptors:[NSArray arrayWithObject:sortByScore]]; 

Después de esto, la matriz scores, serán ordenados por la puntuación ascendente.

+0

¡Muchas gracias por su ayuda! Creé mi propio objeto, es más fácil que antes ordenar mis datos. ¿Por qué usa NSUInteger en lugar de simple int? – Dough

+1

@Dough 'NSUInteger' será de 32 o 64 bits, dependiendo de la plataforma en la que se esté ejecutando. 'int' siempre será de 32 bits, y es la forma preferida y recomendada de usar enteros. –

5

No necesita crear una clase personalizada para algo tan trivial, es una pérdida de código. Debe usar una matriz de NSDictionary (diccionario en ObjC = hash en otros idiomas).

hacerlo de esta manera:

NSMutableArray * array = [NSMutableArray arrayWithObjects: 
          [NSDictionary dictionaryWithObject:@"1" forKey:@"my_label"], 
          [NSDictionary dictionaryWithObject:@"2" forKey:@"my_label"], 
          [NSDictionary dictionaryWithObject:@"3" forKey:@"my_label"], 
          [NSDictionary dictionaryWithObject:@"4" forKey:@"my_label"], 
          [NSDictionary dictionaryWithObject:@"5" forKey:@"my_label"], 
          nil]; 
    NSSortDescriptor * sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"my_label" ascending:YES] autorelease]; 
    [array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
+0

¡Gracias por esta respuesta! Prefiero usar mi propio objeto en mi caso, pero creo que este puede ser uno bueno también: D – Dough

Cuestiones relacionadas