4 回答
TA贡献1946条经验 获得超4个赞
比较方法
要么为对象实现compare方法:
- (NSComparisonResult)compare:(Person *)otherObject { return [self.birthDate compare:otherObject.birthDate];}NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor(更好)
或者通常更好:
NSSortDescriptor *sortDescriptor;sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate" ascending:YES];NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors: @[sortDescriptor]];
通过向阵列添加多个键,您可以轻松地按多个键进行排序。也可以使用自定义比较器方法。看看文档。
块(有光泽!)
从Mac OS X 10.6和iOS 4开始,还可以使用块进行排序:
NSArray *sortedArray;sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { NSDate *first = [(Person*)a birthDate]; NSDate *second = [(Person*)b birthDate]; return [first compare:second];}];
性能
的-compare:
和基于块的方法将是相当快一点,一般来讲,除了使用NSSortDescriptor
作为后者依赖于KVC。该NSSortDescriptor
方法的主要优点是它提供了一种使用数据而不是代码来定义排序顺序的方法,这使得设置起来很容易,因此用户可以NSTableView
通过单击标题行来对其进行排序。
TA贡献1876条经验 获得超6个赞
看NSMutableArray
方法sortUsingFunction:context:
您需要设置一个比较函数,它接受两个对象(类型Person
,因为您要比较两个Person
对象)和一个上下文参数。
这两个对象只是实例Person
。第三个对象是一个字符串,例如@“birthDate”。
此函数返回NSComparisonResult
:NSOrderedAscending
如果PersonA.birthDate
< ,则返回PersonB.birthDate
。NSOrderedDescending
如果PersonA.birthDate
> ,它将返回PersonB.birthDate
。最后,NSOrderedSame
如果PersonA.birthDate
== ,它将返回PersonB.birthDate
。
这是粗糙的伪代码; 你需要充实一个日期对于另一个日期“更少”,“更多”或“相等”意味着什么(例如比较秒 - 自 - 纪元等):
NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) { if ([firstPerson birthDate] < [secondPerson birthDate]) return NSOrderedAscending; else if ([firstPerson birthDate] > [secondPerson birthDate]) return NSOrderedDescending; else return NSOrderedSame;}
如果你想要更紧凑的东西,你可以使用三元运算符:
NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) { return ([firstPerson birthDate] < [secondPerson birthDate]) ? NSOrderedAscending : ([firstPerson birthDate] > [secondPerson birthDate]) ? NSOrderedDescending : NSOrderedSame;}
如果你这么做的话,内联也许可以加快一点。
TA贡献1813条经验 获得超2个赞
我在iOS 4中使用块来完成此操作。不得不将我的数组元素从id转换为我的类类型。在这种情况下,它是一个名为Score的类,其中包含一个名为points的属性。
如果数组的元素不是正确的类型,你还需要决定该怎么做,这个例子我刚刚返回NSOrderedSame
,但是在我的代码中我虽然是个例外。
NSArray *sorted = [_scores sortedArrayUsingComparator:^(id obj1, id obj2){ if ([obj1 isKindOfClass:[Score class]] && [obj2 isKindOfClass:[Score class]]) { Score *s1 = obj1; Score *s2 = obj2; if (s1.points > s2.points) { return (NSComparisonResult)NSOrderedAscending; } else if (s1.points < s2.points) { return (NSComparisonResult)NSOrderedDescending; } } // TODO: default is the same? return (NSComparisonResult)NSOrderedSame;}];return sorted;
PS:这是按降序排序。
TA贡献1772条经验 获得超5个赞
从iOS 4开始,您还可以使用块进行排序。
对于这个特殊的例子,我假设你的数组中的对象有一个'position'方法,它返回一个NSInteger
。
NSArray *arrayToSort = where ever you get the array from... ;NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) { if ([obj1 position] > [obj2 position]) { return (NSComparisonResult)NSOrderedDescending; } if ([obj1 position] < [obj2 position]) { return (NSComparisonResult)NSOrderedAscending; } return (NSComparisonResult)NSOrderedSame;};NSArray *sorted = [arrayToSort sortedArrayUsingComparator:sortBlock];
注意:“已排序”数组将自动释放。
- 4 回答
- 0 关注
- 932 浏览
添加回答
举报