2011-09-20 61 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]];