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. EasyDropDown – 很棒的下拉菜单 含精美主题

    EasyDropDown 是一个 jQuery 插件,你可以毫不费力地将简陋的 Select 元素设置为可定制风格的下拉菜单,用于表单或者一般的导航.和著名的下拉插件 Chosen 很像,但是具有自己 ...

  2. [saiku] JCR在saiku中的运用原理

    转载自: 什么是JAVA内容仓库(Java Content Repository)(1) 什么是JAVA内容仓库(Java Content Repository)(2) 什么是JAVA内容仓库(Jav ...

  3. arguments的基本用法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Qt之图形视图框架

    简述 图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元. 框架包括一个事件传播架构,支 ...

  5. jsp-------------之分页技术(一)

    jsp分页技术之: 如下图:百度的喵 看上图中卡哇伊的小苗的爪子下面的数字,就是分页啦!那我们如何做出这样一个效果呢? 下面我们来逐一分解: jsp分页技术一 :  (算法) /* int pageS ...

  6. iOS:控制器间的数据传递

    在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递.顺传递是指数据的传递方向和控制器的跳转方向相同(如图1):逆传递是指数据的传递方向和控制器的跳转方向相反(如图2).这里分别介绍这 ...

  7. Android SDK的安装以及环境变量的配置

    想来试试app的开发,于是便需要在电脑上安装各种软件包,其中Android SDK就是其中一种,特地记录一下其安装过程: 1.下载地址http://baoku.360.cn/soft/show/app ...

  8. asp.net 错误跳转

    每当用户访问错误页面时,会出现不友好的404错误,所以为了防止这种不友好,我们在web.config中的<system.web>节点下配置 <customErrors>,在出现 ...

  9. The Python web services developer: XML-RPC for Python

    原文地址:http://www.ibm.com/developerworks/webservices/library/ws-pyth10/index.html 摘要:概括地说,您可以将 XML-RPC ...

  10. hihocode ---1032

    #include<iostream> #include<cstring> #include<cstdio> using namespace std; + ; ]; ...