2011-09-20 22 views
11

Nesnelerim bir dizi var ve derecelendirme sayısı ve sonra sayılar oy aşağı göre sıralamak gerekir (böylece iki 5 yıldız derecelendirilen öğeleri karşılaştırırsa, en çok oy olan biri ilk olmalıdır)Birden çok sıralama tanımlayıcısı ayarlama

NSArray'ı iki tanımlayıcı ile sıralamak mümkün mü: önce derecelendirmeden sonra ve sonra oylar sayılıyor mu?

Ben sortUsingDescriptors: gibi http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSortDescriptor_Class/Reference/Reference.html

şey buldum ama, dokümanlar her yerde bulmak o önerilmemektedir düşünemiyorum.

cevap

29

Evet yapabilirsiniz:

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

Temelde haklısınız. NSArray üzerinde,

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

yöntemi vardır. Bu, çeşitli tanımlayıcılara göre sıralanmış yeni bir dizi döndürecektir.

- (void)sortUsingDescriptors:(NSArray *)sortDescriptors 

var, ama sen NSArray belgelerinde bulamadım neden açıklayabilir NSMutableArray üzerindedir. Aynı hedefi gerçekleştirir, ancak yeni bir dizi döndürmek yerine, onu adlandırdığınız diziyi sıralar. Her ikisi de kullanımdan kaldırılmıştır.

0

kullanın - (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors. İşte belgeler geçerli: NSArrayClass Reference

Örn:

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; 

Şerefe!

+0

Kodunuz derlemek olmaz ve Dingin derlemek olmaz sortRating ve sortDate – rckoenes

+0

sızdırıyor. Derleme yapmamasının nedeni, 'sortRating' ve 'sortDate' değişken adlarında yeniden tanımlandığınız içindir. Ayrıca, tanımlanmayan 'sortDescriptor' adlı bir nesne yayınlıyorsunuz ve' sortRating' ve 'sortDate' bırakmıyorsunuz. – rckoenes

1

İşte bir liner.

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

Bir NSArray kullanmak varsa bu bir:

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]]; 
İlgili konular