设置多个排序描述符

时间:2011-09-20 09:24:20

标签: ios objective-c

我有一系列的对象,需要按照评级和后面的票数进行排序(如果两个5星评级元素比较,那么投票最多的那个应该是第一个)

是否可以通过两个描述符对NSArray进行排序:首先是评级后,然后是在计票后?

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

找到了 像sortUsingDescriptors:这样的东西,但我无法在文档的任何地方找到它,认为它已被弃用。

5 个答案:

答案 0 :(得分:30)

是的,你可以:

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 :(得分:1)

你基本上是对的。在NSArray上有

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

方法。这将返回一个新数组,根据各种描述符进行排序。

- (void)sortUsingDescriptors:(NSArray *)sortDescriptors

确实存在,但是在 NSMutableArray 上,这可能解释了为什么在NSArray的文档中找不到它。它实现了相同的目标,但是对您调用它的数组进行排序,而不是返回一个新数组。两者都没有被弃用。

答案 2 :(得分:1)

这是一个单行。

NSArray *sortedArray = [unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey@"rating" ascending:NO], [NSSortDescriptor sortDescriptorWithKey@"date" ascending:NO], nil]];

答案 3 :(得分:0)

使用- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors。以下是文档:NSArray Class 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;

干杯!

答案 4 :(得分: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]];