iOS基础iOS开发iOS开发技术分享

iOS 数组排序问题

2016-08-23  本文已影响981人  乒什么乓

数组元素类型

假设我们这个数组里面的元素是一个 model 类型,比如 CHSAssetGroup,其CHSAssetGroup.h 文件内容如下:

@interface CHSAssetGroup : NSObject

@property (nonatomic, copy) NSString *name; // 名字
@property (nonatomic, copy) NSString *creationDate; // 日期

CHSAssetGroup 有两个属性,第一个是名字,第二个创建日期

数组排序的 key

现在我们创建一个数组,里面有 3 个 CHSAssetGroup类型的对象:

CHSAssetGroup *group_a = [[CHSAssetGroup alloc] init];
group_a.name = @"a";
group_a.creationDate = @"2016-5-28";

CHSAssetGroup *group_b = [[CHSAssetGroup alloc] init];
group_b.name = @"b";
group_b.creationDate = @"2016-8-23";

CHSAssetGroup *group_c = [[CHSAssetGroup alloc] init];
group_c.name = @"c";
group_c.creationDate = @"2016-6-21";

NSArray *array = @[group_a, group_b, group_c];

现在我们要让数组里面的元素按照 CHSAssetGroupcreationDate 降序排序,代码如下:

// Key: 按照排序的key; ascending: YES为升序, NO为降序。
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sorter count:1];
    NSArray *sortedArray = [array sortedArrayUsingDescriptors:sortDescriptors];
    NSLog(@"%@", sortedArray);

NSSortDescriptor 指定用于对象数组排序的对象的属性。sortedArray 即为排序后的数组,其元素顺序为 @[group_b, group_c, group_a];

如果是要求对象按照多可 key 排序,比如先按 name 排序,再按 creationDate 排序。那就创建两个descriptor,将两个 descriptor 放到数组里一起传给需要排序的数组。

    NSSortDescriptor *nameSorter = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:NO];
     NSSortDescriptor *dateSorter = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
    NSArray *sortDescriptors2 = [[NSArray alloc] initWithObjects:nameSorter, dateSorter, nil];

可变数组排序

如果想要排序的数组是一个可变数组,则只需要调用 sortUsingDescriptors: 方法对自身进行排序即可:

    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:group_a, group_b, group_c, nil];
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sorter count:1];
    [mutableArray sortUsingDescriptors:sortDescriptors]
    NSLog(@"%@", mutableArray);

字符串数组排序

如果对象就是NSString,就是字符串数组排序,这就更加简单了,将 sortdescriptorkey 直接指定为 nil,就直接排序对象,而不是对象的某一个属性了。

    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
    NSArray *descriptors = [NSArray arrayWithObject:descriptor];
    NSArray *myDataArray = [NSArray arrayWithObjects:@"what", @"xman", @"highligth", @"mountain", @"success", @"Apple", nil];
    NSArray *sortedArray = [myDataArray sortedArrayUsingDescriptors:descriptors];
    NSLog(@"%@", sortedArray);
上一篇下一篇

猜你喜欢

热点阅读