利用 NSSortDescriptor 对数组排序

593 阅读1分钟

有时我们在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]];