猿问

如何使用自定义对象对NSMutableArray进行排序?

如何使用自定义对象对NSMutableArray进行排序?

我想做的事情似乎很简单,但我在网上找不到任何答案。我有一个NSMutableArray对象,让我们说它们是'人'对象。我想NSMutableArray按Person.birthDate 排序,这是一个NSDate

我认为这与这个方法有关:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

在Java中,我会使我的对象实现Comparable,或者使用带有内联自定义比较器的Collections.sort ...你到底如何在Objective-C中执行此操作?


婷婷同学_
浏览 933回答 4
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通过单击标题行来对其进行排序。

HUX布斯

看NSMutableArray方法sortUsingFunction:context:您需要设置一个比较函数,它接受两个对象(类型Person,因为您要比较两个Person对象)和一个上下文参数。这两个对象只是实例Person。第三个对象是一个字符串,例如@“birthDate”。此函数返回NSComparisonResult:NSOrderedAscending如果PersonA.birthDate<&nbsp;,则返回PersonB.birthDate。NSOrderedDescending如果PersonA.birthDate>&nbsp;,它将返回PersonB.birthDate。最后,NSOrderedSame如果PersonA.birthDate==&nbsp;,它将返回PersonB.birthDate。这是粗糙的伪代码;&nbsp;你需要充实一个日期对于另一个日期“更少”,“更多”或“相等”意味着什么(例如比较秒 - 自 - 纪元等):NSComparisonResult&nbsp;compare(Person&nbsp;*firstPerson,&nbsp;Person&nbsp;*secondPerson,&nbsp;void&nbsp;*context)&nbsp;{ &nbsp;&nbsp;if&nbsp;([firstPerson&nbsp;birthDate]&nbsp;<&nbsp;[secondPerson&nbsp;birthDate]) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NSOrderedAscending; &nbsp;&nbsp;else&nbsp;if&nbsp;([firstPerson&nbsp;birthDate]&nbsp;>&nbsp;[secondPerson&nbsp;birthDate]) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NSOrderedDescending; &nbsp;&nbsp;else&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NSOrderedSame;}如果你想要更紧凑的东西,你可以使用三元运算符:NSComparisonResult&nbsp;compare(Person&nbsp;*firstPerson,&nbsp;Person&nbsp;*secondPerson,&nbsp;void&nbsp;*context)&nbsp;{ &nbsp;&nbsp;return&nbsp;([firstPerson&nbsp;birthDate]&nbsp;<&nbsp;[secondPerson&nbsp;birthDate])&nbsp;?&nbsp;NSOrderedAscending&nbsp;:&nbsp;([firstPerson&nbsp;birthDate]&nbsp;> &nbsp;&nbsp;&nbsp;[secondPerson&nbsp;birthDate])&nbsp;?&nbsp;NSOrderedDescending&nbsp;:&nbsp;NSOrderedSame;}如果你这么做的话,内联也许可以加快一点。

慕姐8265434

我在iOS 4中使用块来完成此操作。不得不将我的数组元素从id转换为我的类类型。在这种情况下,它是一个名为Score的类,其中包含一个名为points的属性。如果数组的元素不是正确的类型,你还需要决定该怎么做,这个例子我刚刚返回NSOrderedSame,但是在我的代码中我虽然是个例外。NSArray&nbsp;*sorted&nbsp;=&nbsp;[_scores&nbsp;sortedArrayUsingComparator:^(id&nbsp;obj1,&nbsp;id&nbsp;obj2){ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;([obj1&nbsp;isKindOfClass:[Score&nbsp;class]]&nbsp;&&&nbsp;[obj2&nbsp;isKindOfClass:[Score&nbsp;class]])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Score&nbsp;*s1&nbsp;=&nbsp;obj1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Score&nbsp;*s2&nbsp;=&nbsp;obj2; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s1.points&nbsp;>&nbsp;s2.points)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NSComparisonResult)NSOrderedAscending; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(s1.points&nbsp;<&nbsp;s2.points)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NSComparisonResult)NSOrderedDescending; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO:&nbsp;default&nbsp;is&nbsp;the&nbsp;same? &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NSComparisonResult)NSOrderedSame;}];return&nbsp;sorted;PS:这是按降序排序。

月关宝盒

从iOS 4开始,您还可以使用块进行排序。对于这个特殊的例子,我假设你的数组中的对象有一个'position'方法,它返回一个NSInteger。NSArray&nbsp;*arrayToSort&nbsp;=&nbsp;where&nbsp;ever&nbsp;you&nbsp;get&nbsp;the&nbsp;array&nbsp;from...&nbsp;;NSComparisonResult&nbsp;(^sortBlock)(id,&nbsp;id)&nbsp;=&nbsp;^(id&nbsp;obj1,&nbsp;id&nbsp;obj2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;([obj1&nbsp;position]&nbsp;>&nbsp;[obj2&nbsp;position])&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NSComparisonResult)NSOrderedDescending; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;([obj1&nbsp;position]&nbsp;<&nbsp;[obj2&nbsp;position])&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NSComparisonResult)NSOrderedAscending; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NSComparisonResult)NSOrderedSame;};NSArray&nbsp;*sorted&nbsp;=&nbsp;[arrayToSort&nbsp;sortedArrayUsingComparator:sortBlock];注意:“已排序”数组将自动释放。
随时随地看视频慕课网APP

相关分类

iOS
我要回答