2011-09-20 29 views
11

Tôi có một mảng đối tượng và cần sắp xếp theo xếp hạng và sau số phiếu bầu (để nếu hai phần tử xếp hạng 5 sao so sánh, thì phần tử có nhiều phiếu bầu nhất sẽ là đầu tiên)thiết lập nhiều bộ mô tả sắp xếp

Có thể sắp xếp một NSArray bằng hai bộ mô tả: đầu tiên sau khi xếp hạng và sau đó sau khi số phiếu bầu?

Tôi đã tìm thấy trên http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSortDescriptor_Class/Reference/Reference.html

cái gì đó như sortUsingDescriptors: nhưng tôi không thể tìm thấy nó ở bất cứ đâu trong tài liệu, nghĩ rằng nó bị phản đối.

Trả lời

29

Có bạn có thể:

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

Về cơ bản bạn có quyền. Trên NSArray có phương thức

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

. Điều này sẽ trả về một mảng mới, được sắp xếp theo các bộ mô tả khác nhau.

- (void)sortUsingDescriptors:(NSArray *)sortDescriptors 

không tồn tại, nhưng là trên NSMutableArray, mà có thể giải thích tại sao bạn không thể tìm thấy nó trong tài liệu hướng dẫn cho NSArray. Nó hoàn thành cùng một mục tiêu, nhưng sắp xếp mảng mà bạn gọi nó, thay vì trả về một mảng mới. Không được chấp nhận.

0

Sử dụng - (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors. Dưới đây là tài liệu: NSArrayClass Reference

ví dụ:

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

Mã của bạn sẽ không biên dịch và bạn đang bị rò rỉ sortRating và sortDate – rckoenes

+0

Tuy nhiên sẽ không biên dịch. Lý do nó sẽ không biên dịch là vì bạn định nghĩa lại các tên biến 'sortRating' và' sortDate'. Ngoài ra, bạn đang phát hành một đối tượng gọi là 'sortDescriptor' không được định nghĩa và bạn không giải phóng' sortRating' và 'sortDate'. – rckoenes

1

Đây là một lớp lót.

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

Nếu bạn có một NSArray sử dụng này một:

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]]; 
Các vấn đề liên quan