NSArray排序方法讲解

最麻烦的是sortedArrayUsingSelector:,其次是sortedArrayUsingDescriptors:,最容易使用的就是sortedArrayUsingComparator:

从最容易使用的开始吧:

 1 #pragma mark -----   数组排序方式1:sortedArrayUsingComparator:   【block方式的排序是最简单的】
 2     
 3     //原始数组
 4     NSArray *array = @[@"b",@"a",@"x",@"o",@"0",@"g"];
 5     
 6     //排序数组
 7     NSArray *sort = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
 8         NSString *str1 = obj1;
 9         NSString *str2 = obj2;
10         return [str1 compare:str2];
11     }];
12     
13     //打印排序数组
14     [sort enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
15         MyLog(@"%@",obj);
16     }];

下面一行就解决了,太esay了

要对什么类型的对象排序,就用什么类型的对象接收就行了

是不是简单过头了呢.

请记住,用block排序是最简单的方式!

下面来试试sortedArrayUsingDescriptors:这个方法.

sortedArrayUsingDescriptors:一般用来给Model进行排序,block也能对Model进行排序.先给出Model的定义(看教程不要太懒,自己敲代码吧)

以下是排序的代码:

 1 #pragma mark -------  数组排序方式2:sortedArrayUsingDescriptors:给Model排序
 2     
 3     //原始数组
 4     NSArray *modelArray = @[[PersonModel name:@"YuanYuan" age:@22 height:165],
 5                             [PersonModel name:@"DaChao" age:@24 height:179],
 6                             [PersonModel name:@"XiaoMing" age:@12 height:155],
 7                             [PersonModel name:@"ZhangSan" age:@28 height:186],
 8                             [PersonModel name:@"GaoZeBing" age:@23 height:172]];
 9     
10     
11     //排序描述信息
12     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
13     NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
14     NSArray *sortedArray = [modelArray sortedArrayUsingDescriptors:sortDescriptors];
15     
16     //打印排序信息
17     [sortedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
18         PersonModel *tmp = obj;
19         MyLog(@"%@",tmp.name);
20     }];

看下图,其实呢,NSSortDescriptor只是一个获取keyPath的工具,他能根据keyPath进行排序而已,仅此而已:)

看一下打印信息

2014-07-04 11:09:00.494 NSArraySorted[1784:60b] DaChao
2014-07-04 11:09:00.496 NSArraySorted[1784:60b] GaoZeBing
2014-07-04 11:09:00.496 NSArraySorted[1784:60b] XiaoMing
2014-07-04 11:09:00.496 NSArraySorted[1784:60b] YuanYuan
2014-07-04 11:09:00.497 NSArraySorted[1784:60b] ZhangSan

很easy吧.

这种东西还是封装成类目比较好的样子.

使用:

 1  //原始数组
 2     NSArray *modelArray = @[[PersonModel name:@"YuanYuan" age:@22 height:165],
 3                             [PersonModel name:@"DaChao" age:@24 height:179],
 4                             [PersonModel name:@"XiaoMing" age:@12 height:155],
 5                             [PersonModel name:@"ZhangSan" age:@28 height:186],
 6                             [PersonModel name:@"GaoZeBing" age:@23 height:172]];
 7   NSArray *sortedChangeArray = [modelArray sortedWithKeyPath:@"age" ascending:YES];
 8     
 9     [sortedChangeArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
10         PersonModel *tmp = obj;
11         MyLog(@"%@",tmp.age);
12     }];
13     

一句话就能实现排序,多简单:),开发就得隐藏不必要的繁文缛节,减少不必要的干扰才是正道.

第三种方法sortedArrayUsingSelector:,也许是你最常用的方法,这个我就不讲了,我觉得太麻烦了,还得另外写一个比较的方法......

总结:

==本人倾向于这么用==

1. 优先用block排序

2. 用NSSortDescriptor的keyPath排序

3. 再不济请用sortedArrayUsingSelector:方法排序

 

原文地址:https://www.cnblogs.com/yuanyuandachao/p/3824062.html