2011-09-20 27 views
11

Ho una matrice di oggetti e ho bisogno di ordinarlo per valutazione e dopo per numero di voti discendente (in modo che se due elementi classificati a 5 stelle si confrontano, quello con il maggior numero di voti dovrebbe essere il primo)impostazione più descrittori di ordinamento

È possibile ordinare un NSArray con due descrittori: prima dopo la valutazione e poi dopo il conteggio dei voti?

che ho trovato su http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSortDescriptor_Class/Reference/Reference.html

qualcosa come sortUsingDescriptors: ma non riesco a trovare da nessuna parte nella documentazione, pensano che sia deprecato.

risposta

29

Sì, è possibile:

NSSortDescriptor *sortRating = [[NSSortDescriptor alloc] initWithKey:@"rating" ascending:NO]; 
NSSortDescriptor *sortVotes = [[NSSortDescriptor alloc] initWithKey:@"votes" ascending:NO]; 

NSArray *sortedArray = [orignalAray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortRating, sortVotes, nil]]; 
[sortRating release], sortRating = nil; 
[sortVotes release], sortVotes = nil; 
1

Hai praticamente ragione. Su NSArray c'è il

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors 

metodo. Ciò restituirà un nuovo array, ordinato in base a vari descrittori.

- (void)sortUsingDescriptors:(NSArray *)sortDescriptors 

esiste, ma è in NSMutableArray, il che potrebbe spiegare il motivo per cui non si poteva trovare nella documentazione per NSArray. Raggiunge lo stesso obiettivo, ma ordina l'array su cui lo si chiama, piuttosto che restituire un nuovo array. Nessuno dei due è deprecato.

0

Usa - (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors. Ecco la documentazione: NSArrayClass Reference

es:

NSSortDescriptor *sortRating = nil; 
NSSortDescriptor *sortDate = nil; 

NSSortDescriptor *sortRating = [[NSSortDescriptor alloc] initWithKey:@"rating" ascending:NO]; 
NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; 
NSArray *sortedArray = [auxArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortRating,sortDate,nil]]; 

[sortRating release]; 
sortRating = nil; 

[sortDate release]; 
sortDate = nil; 

Cheers!

+0

Il codice non viene compilato e vi sono perdite sortRating e sortDate – rckoenes

+0

Ancora non verrà compilato. Il motivo per cui non verrà compilato è perché si ridefiniscono i nomi delle variabili 'sortRating' e' sortDate'. Inoltre rilascerai un oggetto chiamato 'sortDescriptor' che non è definito e non rilascerai' sortRating' e 'sortDate'. – rckoenes

1

Ecco un one-liner.

NSArray *sortedArray = [unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor [email protected]"rating" ascending:NO], [NSSortDescriptor [email protected]"date" ascending:NO], nil]]; 
0

Se si dispone di utilizzare uno NSArray questo:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"x_date" ascending:TRUE]; 
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"x_time" ascending:TRUE]; 
[tempArray sortUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,sortDescriptor1, nil]]; 
Problemi correlati