2011-09-20 66 views
11

我有一個對象數組,需要按照評分和後面的票數進行排序(這樣如果兩個5星評級的元素比較,票數最多的那個應該是第一個)設置多個排序描述符

是否有可能通過兩個描述符對NSArray進行排序:首先在評級之後,然後在票數之後進行計數?

我對http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSortDescriptor_Class/Reference/Reference.html

sortUsingDescriptors:找到,但我不能在任何地方文檔找到它,認爲它過時。

回答

29

是,您可以:

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

你基本上是對的。在NSArray的存在

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

方法。這將返回一個新的數組,根據各種描述符進行排序。

- (void)sortUsingDescriptors:(NSArray *)sortDescriptors 

確實存在,但在的NSMutableArray,這或許可以解釋爲什麼你不能爲NSArray的文檔中找到它。它實現了相同的目標,但對您調用的數組進行排序,而不是返回一個新的數組。兩者都不被棄用。

0

使用- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors。下面是文檔:NSArrayClass Reference

E.g:

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; 

乾杯!

+0

您的代碼將無法編譯,你都滲出sortRating和sortDate – rckoenes

+0

仍然不會編譯。它不會編譯的原因是因爲你重新定義了變量名稱sortRate和sortDate。你也發佈了一個名爲'sortDescriptor'的對象,它沒有被定義,你不會釋放'sortRating'和'sortDate'。 – rckoenes

1

這裏是一行代碼。

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

如果你有一個NSArray中使用這一個:

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