iOS 数组排序

iOS对存放对象的数组排序

//我们将要排序的对象是一个Persion类,如下定义:

@interface Person : NSObject 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, strong) NSDate *dateOfBirth; 
@end 
//而数组中包含如下内容:
//Smith 03/01/1984 
//Andersen 16/03/1979 
//Clark 13/09/1995 

1.使用NSComparator进行排序

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
上面的参数(obj1、obj2)就是我们将要做比较的对象。block返回的结果为NSComparisonResult类型来表示两个对象的顺序。
要对整个数组做排序,则需要使用NSArray的sortArrayUsingComparator:方法,如下代码所示:

NSArray *sortedArray = [self.persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2){ 
//对数组进行排序(升序)
    return [p1.dateOfBirth compare:p2.dateOfBirth]; 
//对数组进行排序(降序)
// return [p2.dateOfBirth compare:p1.dateOfBirth]; 
}]; 

2.使用NSDescriptor进行排序
Sort descriptor不仅可以用来对数组进行排序,还能指定element在table view中的排序,以及Core Data中对fetch request返回的数据做排序处理。通过sort descriptor可以很方便的对数组进行多个key的排序。下面来看看如何对我们的数组做surname排序,然后在进行name排序:

NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dateOfBirth" ascending:YES]; 
NSSortDescriptor *secondDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
 
NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, secondDescriptor, nil]; 
 
NSArray *sortedArray = [self.persons sortedArrayUsingDescriptors:sortDescriptors]; 

上面代码的排序结果如下所示:
Andersen Jane
Clark Anne

3.使用selector进行排序
当面,我们也可以定义自己的方法进行两个对象做比较,并将该方法用于数组排序。comparator消息会被发送到数值中的每个对象中,并携带数组 中另外的一个对象当做参数。自定义的的方法的返回结果是这样的:如果本身对象小于参数中的对象,就返回NSOrederedAscending,相反,则 返回NSOrderedDescending,如果相等,那么返回NSOrderedSame。如下代码所示:

- (NSComparisonResult)compare:(Person *)otherPerson { 
    return [self.dateOfBirth compare:otherPerson.dateOfBirth]; 
} 

这个方法定义在Person类中,用来对person的生日进行排序。

  //日期去重
    NSSet *set = [NSSet setWithArray:@[@"2019-05-23 11:48:17",@"2019-05-23 11:48:32"]];
    NSArray *userArray = [set allObjects];
    
    //重新降序排序
    NSSortDescriptor *sd1 = [NSSortDescriptor sortDescriptorWithKey:nil ascending:NO];//yes升序排列,no,降序排列
    NSArray *descendingDateArr = [userArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sd1, nil]];
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、NSSortDescriptor排序 概述: 数组是有序容器,因此集合中只有数组才能排序。该类能够方便的实现对...
    lingxuemy阅读 1,592评论 0 2
  • Pre:很多文章对于SEL排序讲解太过含糊,特写此文讲述清楚。 官方提供了几个api进行数组排序操作,开发者只需提...
    圆脸黑猫警长阅读 24,041评论 0 22
  • 数组元素类型 假设我们这个数组里面的元素是一个 model 类型,比如 CHSAssetGroup,其CHSAss...
    乒什么乓阅读 4,112评论 0 8
  • 简单的字符串等排序 方式一: 同样不仅仅是字符串类型,NSNumber 效果也不错哦 方式二 : 可以看到 是升序...
    相敬如冰阅读 550评论 0 0
  • 数组翻转 数组升序 数组降序 获取数组对象和,平均数,最大值,最小值 冒泡排序 原理:比较两个相邻的元素,将值大的...
    赵哥窟阅读 1,267评论 0 2