利用 NSSortDescriptor 对数组排序

有时我们在NSMutableArray中存的是网络请求返回的数据,而每一个元素又是一个NSDictionary,如果这时候需要把数组中的元素按照每个元素字典中某一个key来排序,那么我们可以利用OC中的类:NSSortDescriptor来快速实现需求。这个是oc官方的排序方法,使用起来非常方便

以下就通过一个栗子来演示以下,可直接拷贝代码到项目里面运行

   //通过对可变数组里面的字典的某个key值进行排序 
   NSMutableArray *dicArray = [NSMutableArray array];
    
    for (int i = 0; i<5; i++) {
        
        NSInteger x = arc4random() % 100;
        [dicArray addObject:@{@"num":[NSNumber numberWithInteger:x]}];
        
    }
    
    for (NSDictionary *dic in dicArray) {
        
        NSLog(@"未排序之前>>>>>>%@",dic[@"num"]);
        
    }
    
    
    NSSortDescriptor *distanceDescriptor = [[NSSortDescriptor alloc] initWithKey:@"num" ascending:YES];
    
    NSArray *descriptors = [NSArray arrayWithObjects:distanceDescriptor,nil];
    
    [dicArray sortUsingDescriptors:descriptors];
    
    for (NSDictionary *dict in dicArray) {
        
        NSLog(@"排序后>>>>>>%@",dict[@"num"]);
    }
log1

除了对number数据类型进行排序之外,如果数组对象是NSString类型的,也就是对字符串数组进行排序,那么就更简单了,sortDescriptorWithKey直接指定为nil就搞定了。

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
NSArray *descriptors = [NSArray arrayWithObject:descriptor];
NSArray *myDataArray = [NSArray arrayWithObjects:@"what", @"xero", @"highligth", @"mountain", @"Victory", @"Balance", nil];
NSArray *resultArray = [myDataArray sortedArrayUsingDescriptors:descriptors];
NSLog(@"%@", resultArray);
log2

这里需要注意一下:

NSArray 使用sortedArrayUsingDescriptors,返回排序好的数组;

NSMutableArray可以直接使用sortUsingDescriptors,对数组本身排序。

这里我们不难发现sortedArrayUsingDescriptors和sortUsingDescriptors这两个方法都是需要传一个Descriptors数组的,也就是说可以使用多个排序参数,非常好用!

再举个栗子,比如说User有一个属性叫做image,而image又有个属性叫timestamp,如果要根据User的image关系的timestamp排序,那么NSSortDescriptor传的key值应该是@“image.timestamp”

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"image.timestamp" ascending:YES]; 

[userArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数组可对其中包含的元素进行排序。 在排序前,我们需要定义一个Model类,将Model类对象添加至数组中。 定义一...
    SkyMing一C阅读 13,730评论 0 15
  • 面向对象三大支柱封装:就是把相关的数据和代码结合成一个有机的整体,形成数据和操作代码的封装体,对外只提供一个可以控...
    WangDavid阅读 5,679评论 0 2
  • 1. 熟悉Git的基本流程 git clone git add -A git commit -m " " git ...
    9bf19a4010ab阅读 5,626评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,329评论 19 139
  • 每次到这家位于纽约小镇PortChester的邮局来寄东西,就忍不住赞赏这座充满历史感的建筑与装潢的地标性建筑,全...
    纽约桃花阅读 4,200评论 1 3