iOS探索:对NSArray中自定义的对象进行排序
http://mobile.51cto.com/hot-434804.htm
我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中。例如一个音乐程序可能会有一个Song类,聊天程序则又一个 Friend类,点菜程序会有一个Recipe类等。有时候我们希望在程序中显示的列表数据是按照一定顺序进行排列的,本文我们就来看看在iOS中有哪些 方法可以对NSArray中的对象进行排序。下面是目录:
- 小引
- 使用NSComparator进行排序
- 使用NSDescriptor进行排序
- 使用selector进行排序
小引
我们将要排序的对象是一个Persion类,如下定义:
- @interface Person : NSObject
- @property (nonatomic, copy) NSString *name;
- @property (nonatomic, copy) NSString *surname;
- @property (nonatomic, strong) NSDate *dateOfBirth;
- @end
而数组中包含如下内容:
- Smith John 03/01/1984
- Andersen Jane 16/03/1979
- Clark Anne 13/09/1995
- Smith David 19/07/1981
- Johnson Rose 22/02/1989
使用NSComparator进行排序
comparator实际上是用一个block对象作比较操作。它的定义如下所示:
- 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.surname compare:p2.surname];
- }];
最终排序的结果如下所示:
- Andersen Jane
- Clark Anne
- Johnson Rose
- Smith John
- Smith David
使用NSDescriptor进行排序
Sort descriptor不仅可以用来对数组进行排序,还能指定element在table view中的排序,以及Core Data中对fetch request返回的数据做排序处理。通过sort descriptor可以很方便的对数组进行多个key的排序。下面来看看如何对我们的数组做surname排序,然后在进行name排序:
- NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"surname" 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
- Johnson Rose
- Smith David
- Smith John
使用selector进行排序
当面,我们也可以定义自己的方法进行两个对象做比较,并将该方法用于数组排序。comparator消息会被发送到数值中的每个对象中,并携带数组中另外的一个对象当做参数。自定义的的方法的返回结果是这样的:如果本身对象小于参数中的对象,就返回NSOrederedAscending,相反,则返回NSOrderedDescending,如果相等,那么返回NSOrderedSame。如下代码所示:
- - (NSComparisonResult)compare:(Person *)otherPerson {
- return [self.dateOfBirth compare:otherPerson.dateOfBirth];
- }
这个方法定义在Person类中,用来对person的生日进行排序。
上面所介绍的这些方法都是为了完成相同的事情:对数组做排序处理,你可能在想改选择使用哪个呢?当需要通过多个key进行排序,那么最简单的方法就 是使用sort descriptor。如果比较方法很复杂的话,建议在使用外面自己的selector。Block是再iOS 4之后引入的一个强大功能,用block作比较,可以不必使用任何的变量就能完成一个简单的比较方法,当然,你也可以定义一个复杂的block,来替换 selector。
最后,其实这里并没有标准答案,你可以跟着自己的感觉走:]
iOS探索:对NSArray中自定义的对象进行排序的更多相关文章
- 一段可以清理NSArray中的空对象的代码(递归)
- (NSArray *)clearAllNullObject{ NSMutableArray *array = [self mutableCopy]; ;i < array.count;i++ ...
- python中自定义类对象json字符串化的方法
1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...
- NSArray中的对象进行排序
看在iOS中有哪些方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor进行排序 使用selector进行排序 小引 我们将要 ...
- iOS 使用NSUserdefault 保存自定义的 对象
一:NSUserDefaults支持的数据格式有:NSNumber(Integer.Float.Double),NSString,NSData,NSArray,NSDictionary,BOOL类型: ...
- CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)
由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...
- iOS 自定义的对象类型的解档和归档
自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h ...
- iOS开发小技巧--获取自定义的BarButtonItem中的自定义View的方法(customView)
如果BarButtonItem是通过[[UIBarButtonItem alloc] initWithCustomView:(nonnull UIView *)]方法设置的.某些情况下需要修改BarB ...
- iOS 自定义控件开发(中)
<iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...
- iOS已发布应用中对异常信息捕获和处理
iOS已发布应用中对异常信息捕获和处理 iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的. iO ...
随机推荐
- jmeter 建立一个扩展LDAP测试计划
添加用户 第一步你想做的每一个JMeter测试计划是添加一个线程组元素. 线程组告诉JMeter的用户数量你想模拟,用户应该发送的次数 请求,他们应该发送的请求的数量. 继续添加 线程组 首先选择元素 ...
- python 练习 27
ython continue 语句跳出本次循环,而break跳出整个循环. continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环. continue语句用在whil ...
- 企业用户选择Java多于.NET的 5个原因
.NET 和 Java 是当今社会最受欢迎的两种编程语言, 长期的发展和强大的功能使他们足以在编程界立足. 十余年的争论也没得到结果的一个话题就是——他们哪个更好一些? 今天, 我们不再去讨论JAVA ...
- 《Java程序设计》第六周学习总结
20145224 <Java程序设计>第六周学习总结 教材学习内容总结 第十章输入和输出 10.1.1 ·若要将数据从来源中取出,可以使用输入串流:若要将数据写入目的地,可以使用输出串流. ...
- hadoop分布式的环境搭建
版本: 使用hadoop1.1.2 JDK为java7 1.下载hadoop 2.配置hadoop文件 3测试 1.下载hadoop: 1.1 在https://archive.apache.o ...
- spring之初识Ioc&Aop
Spring框架的作用 spring是一个轻量级的企业级框架,提供了ioc容器.Aop实现.dao/orm支持.web集成等功能,目标是使现有的java EE技术更易用,并促进良好的编程习惯. Spr ...
- matlab可变参数
Varargin Nargin if nargin == 2 a1 = varargin{1}; a2 = varargin{2};
- EF Code First 学习笔记:关系
一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性.导航属性等检测到模型之 ...
- discuz 同步登录问题
最近一直在搞discuz论坛的二次开发,发现在论坛登录或退出的时候应用却没有同步登录或同步退出,这下子麻烦了,后来查看,原来没有产生js的同步代码,查找原因,发现$_G['setting']['all ...
- 使用URL访问网络资源
URL(Uniform Resource Locator)对象代表统一资源定位器,它是指向互联网“资源”的指针.资源可以是简单的文件或目录,也可以是对更复杂的对象的引用,例如对数据库或搜索引擎的查 ...