ios - 如何对包含自定义对象的 NSMutableArray 进行排序?

我想做的事情看起来很简单,但我在网上找不到任何答案。我有一个 NSMutableArray 对象,假设它们是“Person”对象。我想按 Person.birthDate 对 NSMutableArray 进行排序,这是一个 NSDate

我觉得跟这个方法有关系:

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

在 Java 中,我会让我的对象实现 Comparable,或者将 Collections.sort 与内联自定义比较器一起使用...在 Objective-C 中你到底是如何做到这一点的?

最佳答案

比较方法

要么为你的对象实现一个比较方法:

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

您可以通过向数组中添加多个键轻松地按多个键排序。也可以使用自定义比较器方法。看看the documentation .

block ( Shiny !)

从 Mac OS X 10.6 和 iOS 4 开始,也可以使用 block 进行排序:

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(Person *a, Person *b) {
    return [a.birthDate compare:b.birthDate];
}];

性能

-compare: 和基于 block 的方法通常比使用 NSSortDescriptor 快很多,因为后者依赖于 KVC。 NSSortDescriptor 方法的主要优点是它提供了一种使用数据而不是代码来定义排序顺序的方法,这使得它很容易例如进行设置,以便用户可以通过单击标题行对 NSTableView 进行排序。

https://stackoverflow.com/questions/805547/

相关文章:

ios - 如何为约束更改设置动画?

ios - 如何查看iOS版本?

ios - 如何将 NSString 值转换为 NSData?

ios - 如何在 Objective-C 中创建委托(delegate)?

objective-c - 在 Objective-C 中生成随机数

objective-c - 如何从 Swift 调用 Objective-C 代码?

objective-c - Objective-C 中的 typedef 枚举是什么?

ios - Objective-C 中的常量

objective-c - Objective-C 中用于连接 NSString 的快捷方式

ios - 如何在 Objective-C 中检查一个字符串是否包含另一个字符串?