iOS探索:对NSArray中自定义的对象进行排序

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

本文译自How to sort NSArray with custom objects

[[110950]]

我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中。例如一个音乐程序可能会有一个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.  
  4. NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, secondDescriptor, nil]; 
  5.  
  6. 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]; 

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

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

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

责任编辑:闫佳明 来源: beyondvincent
相关推荐

2019-11-19 08:04:16

JavaHashSet去重

2010-03-01 11:10:41

WCF绑定元素

2013-06-27 11:10:01

iOS开发自定义UISlider

2013-07-18 16:09:10

自定义iOS状态栏iOS开发iOS学习

2022-09-20 07:01:50

对象初始化代码

2022-06-06 09:01:16

SwiftUI自定义导航

2024-01-05 15:28:06

鸿蒙数据同步GlobalThis

2022-10-09 08:35:06

SQL自定义排序

2021-11-23 15:06:42

Kubernetes 运维开源

2011-08-02 11:17:13

iOS开发 View

2013-05-30 15:53:17

iOS开发iOS SDKPopver

2021-01-20 08:58:39

iOS 14桌面图标快捷指令

2017-10-25 14:07:54

APPiOSxcode

2012-06-01 11:02:33

2010-05-11 13:16:21

Unix awk

2009-11-12 16:14:28

ADO.NET自定义对

2009-08-03 16:37:49

C#异常类

2009-11-25 14:36:39

PHP函数usort(

2011-06-15 09:24:36

Qt Widget Model

2012-12-24 14:42:48

iOS自定义状态栏
点赞
收藏

51CTO技术栈公众号