2010-05-04 13 views
6

Attualmente sto utilizzando NSMutableArrays nei miei sviluppi per archiviare alcuni dati presi da un servlet HTTP.Objective-C: ordinamento NSMutableArray contenente NSMutableArrays

Tutto va bene poiché ora devo ordinare ciò che è nel mio array.

Questo è quello che faccio:

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]]; 

Prima colonna contiene un'etichetta e 2 ° uno è un punteggio che voglio l'array da ordinare discendente.

Il modo in cui sto archiviando i miei dati è buono? C'è un modo migliore per farlo rispetto all'utilizzo di NSMutableArrays in NSMutableArray?

Sono nuovo per Dev di iPhone, ho visto qualche codice sull'ordinamento ma non mi sentivo bene con quello.

Grazie in anticipo per le vostre risposte!

+1

Questo non è un errore di per sé, ma non è un buon stile di dire '[[NSMutableArray arrayWithObjects: nil] mantenere]'. Invece dovresti semplicemente usare '[NSMutableArray initWithObjects: nil]'. –

+0

In realtà, dovresti semplicemente usare '[[NSMutableArray alloc] init]'. –

+0

Oppure '[NSMutableArray array]'. –

risposta

10

Questo sarebbe molto più facile se si dovesse creare un oggetto personalizzato (o almeno usare un NSDictionary) per memorizzare le informazioni, invece di usare un array.

Ad esempio:

//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 

Dopo aver popolato l'array scores, ora è possibile farlo:

//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]]; 

Dopo questo, l'array scores verranno ordinati per l'ascendente punteggio.

+0

Grazie mille per il vostro aiuto! Ho creato il mio oggetto, è molto più facile di prima per ordinare i miei dati. Perché usi NSUInteger invece di int semplice? – Dough

+1

@Dough 'NSUInteger' sarà 32 o 64 bit, a seconda della piattaforma su cui è in esecuzione. 'int' sarà sempre a 32 bit e rappresenta il metodo preferito e consigliato per utilizzare gli interi. –

5

Non è necessario creare una classe personalizzata per qualcosa di così banale, è uno spreco di codice. È necessario utilizzare un array di NSDictionary (dizionario in ObjC = hash in altre lingue).

fare in questo modo:

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

Grazie per questa risposta! Preferisco usare il mio oggetto nel mio caso, ma penso che questo possa essere anche un buon modo: D – Dough

Problemi correlati