http://mobile.51cto.com/hot-434804.htm

我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中。例如一个音乐程序可能会有一个Song类,聊天程序则又一个 Friend类,点菜程序会有一个Recipe类等。有时候我们希望在程序中显示的列表数据是按照一定顺序进行排列的,本文我们就来看看在iOS中有哪些 方法可以对NSArray中的对象进行排序。下面是目录:

  • 小引
  • 使用NSComparator进行排序
  • 使用NSDescriptor进行排序
  • 使用selector进行排序

小引

我们将要排序的对象是一个Persion类,如下定义:

  1. @interface Person : NSObject
  2. @property (nonatomic, copy) NSString *name;
  3. @property (nonatomic, copy) NSString *surname;
  4. @property (nonatomic, strong) NSDate *dateOfBirth;
  5. @end

而数组中包含如下内容:

  1. Smith John 03/01/1984
  2. Andersen Jane 16/03/1979
  3. Clark Anne 13/09/1995
  4. Smith David 19/07/1981
  5. Johnson Rose 22/02/1989

使用NSComparator进行排序

comparator实际上是用一个block对象作比较操作。它的定义如下所示:

  1. typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

上面的参数(obj1、obj2)就是我们将要做比较的对象。block返回的结果为NSComparisonResult类型来表示两个对象的顺序。

要对整个数组做排序,则需要使用NSArray的sortArrayUsingComparator:方法,如下代码所示:

  1. NSArray *sortedArray = [self.persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2){
  2. return [p1.surname compare:p2.surname];
  3. }];

最终排序的结果如下所示:

  1. Andersen Jane
  2. Clark Anne
  3. Johnson Rose
  4. Smith John
  5. Smith David

使用NSDescriptor进行排序

Sort descriptor不仅可以用来对数组进行排序,还能指定element在table view中的排序,以及Core Data中对fetch request返回的数据做排序处理。通过sort descriptor可以很方便的对数组进行多个key的排序。下面来看看如何对我们的数组做surname排序,然后在进行name排序:

  1. NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"surname" ascending:YES];
  2. NSSortDescriptor *secondDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
  3. NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, secondDescriptor, nil];
  4. NSArray *sortedArray = [self.persons sortedArrayUsingDescriptors:sortDescriptors];

上面代码的排序结果如下所示:

  1. Andersen Jane
  2. Clark Anne
  3. Johnson Rose
  4. Smith David
  5. Smith John

使用selector进行排序

当面,我们也可以定义自己的方法进行两个对象做比较,并将该方法用于数组排序。comparator消息会被发送到数值中的每个对象中,并携带数组中另外的一个对象当做参数。自定义的的方法的返回结果是这样的:如果本身对象小于参数中的对象,就返回NSOrederedAscending,相反,则返回NSOrderedDescending,如果相等,那么返回NSOrderedSame。如下代码所示:

  1. - (NSComparisonResult)compare:(Person *)otherPerson {
  2. return [self.dateOfBirth compare:otherPerson.dateOfBirth];
  3. }

这个方法定义在Person类中,用来对person的生日进行排序。

上面所介绍的这些方法都是为了完成相同的事情:对数组做排序处理,你可能在想改选择使用哪个呢?当需要通过多个key进行排序,那么最简单的方法就 是使用sort descriptor。如果比较方法很复杂的话,建议在使用外面自己的selector。Block是再iOS 4之后引入的一个强大功能,用block作比较,可以不必使用任何的变量就能完成一个简单的比较方法,当然,你也可以定义一个复杂的block,来替换 selector。

最后,其实这里并没有标准答案,你可以跟着自己的感觉走:]

iOS探索:对NSArray中自定义的对象进行排序的更多相关文章

  1. 一段可以清理NSArray中的空对象的代码(递归)

    - (NSArray *)clearAllNullObject{ NSMutableArray *array = [self mutableCopy]; ;i < array.count;i++ ...

  2. python中自定义类对象json字符串化的方法

    1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...

  3. NSArray中的对象进行排序

    看在iOS中有哪些方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor进行排序 使用selector进行排序 小引 我们将要 ...

  4. iOS 使用NSUserdefault 保存自定义的 对象

    一:NSUserDefaults支持的数据格式有:NSNumber(Integer.Float.Double),NSString,NSData,NSArray,NSDictionary,BOOL类型: ...

  5. 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 ...

  6. iOS 自定义的对象类型的解档和归档

    自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h ...

  7. iOS开发小技巧--获取自定义的BarButtonItem中的自定义View的方法(customView)

    如果BarButtonItem是通过[[UIBarButtonItem alloc] initWithCustomView:(nonnull UIView *)]方法设置的.某些情况下需要修改BarB ...

  8. iOS 自定义控件开发(中)

    <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...

  9. iOS已发布应用中对异常信息捕获和处理

    iOS已发布应用中对异常信息捕获和处理 iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的. iO ...

随机推荐

  1. jsp之 ---- 页面重定向和请求转发(笔记之深度说明)

    1.  HttpServletResponse对象的sendRedirect(String location)方法称作重定向. 如果location地址前面加上“/”,则表示  相对于Servlet容 ...

  2. java 多线程——一个定时调度的例子

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  3. struts2 <s:iterator> status属性

    struts2 <s:iterator> status属性 转载▼   iterator标签主要是用于迭代输出集合元素,如list set map 数组等,在使用标签的时候有三个属性值得我 ...

  4. 20145236 《Java程序设计》第7周学习总结

    20145236 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 时间与日期 认识时间与日期 时间的度量 格林威治标准时间GMT 格林威治标准时间的正午是太阳抵达天空最高点 ...

  5. SAP连接HANA数据库

    既然都用HANA了,为什么还要在SAP端,连接HANA数据库,做数据库处理..... 因为HANA数据库,没个用户在STADIO上建的数据库表...只能这个用户使用,而做Universe 设计的时候, ...

  6. 如何创建一个客户端回调:js获得服务端的内容?

    答案:表面上看去就是前端的js调用服务的C#方法,本质就是ajax,通过XMLHttpRequest对象和服务端进行交互.回调:就说回过头来调用,按理说js是一种脚本语言,怎么能用来调用服务端的呢?就 ...

  7. PULL解析

    PULL解析类似于SAX解析,都采用事件驱动(利用getEventType()方法)方式进行解析,当PULL解析器开始解析之后,可以不断地调用PULL解析器的next()方法获取下一个解析事件(开始文 ...

  8. [Js]拖拽

    分析: 1.鼠标按下,拖拽开始,鼠标移动,拖拽进行,鼠标抬起,拖拽结束(三个事件) 2.被拖动元素与鼠标之间的位置在拖动过程中始终不变,利用这个原理,被拖动元素的位置就是鼠标的左(上)边距-鼠标与被拖 ...

  9. Oracle练习题(1~19)

    1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录. 4. 查询Score表中成绩在 ...

  10. LA 3516 - Exploring Pyramids

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...