NSSortDescriptor排序

在OC中,使用NSSortDescriptor可以实现按对象的属性进行排序。例如,我们有个User对象数组,想根据对象的年龄或者姓名拼音的首字母排序,就可以使用NSSortDescriptor。

首先,先简单的看一下这个类的效果。

NSArray *array = @[@"c", @"b", @"a", @"e", @"d"];

//创建一个排序条件,也就是一个NSSortDescriptor对象
//第一个参数为数组中对象要按照什么属性来排序(如自身、姓名,年龄等)
//第二个参数为指定排序方式是升序还是降序
//ascending  排序的意思,默认为YES 升序
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];

NSArray *newArray = [array sortedArrayUsingDescriptors:@[sort]];

NSLog(@"%@", newArray);
排序效果
sortedArrayUsingDescriptors: 这个方法的参数是一个数组,可以将多个排序条件放到数组中,按先后顺序,先加入的优先级高。

新建一个User类,User.h代码如下

  /** 姓名 */
  @property (nonatomic, copy) NSString *name;

  /** 年龄 */
  @property (nonatomic, assign) NSInteger age;

  - (instancetype) initWithName:(NSString *)name Age:(NSInteger)age;

User.m代码如下

- (instancetype) initWithName:(NSString *)name Age:(NSInteger)age
{
    self = [super init];
    if (self) {
        self.name = name;
        self.age  = age;
    }
    return self;
}

接下来我们看一下在ViewController中的具体实现:

// 创建5个user对象
User *user1 = [[User alloc] initWithName:@"MM" Age:8];
User *user2 = [[User alloc] initWithName:@"MM" Age:3];
User *user3 = [[User alloc] initWithName:@"AA" Age:2];
User *user4 = [[User alloc] initWithName:@"SS" Age:7];
User *user5 = [[User alloc] initWithName:@"GG" Age:5];

// 将创建好的对象放入数组中,等待排序
NSArray *userArr = @[user1, user2, user3, user4, user5];

// 创建两个排序条件,分别按照姓名首字母排序和年龄排序
NSSortDescriptor *des1 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

NSSortDescriptor *des2 = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO];

// 将两个排序条件添加到数组中
NSArray *newUserArr = [userArr sortedArrayUsingDescriptors:@[des1, des2]];

// 循环输出一下得到的新数组
for (User *user in newUserArr) {
    
    NSLog(@"姓名:%@ -- 年龄:%@", user.name, user.age);
    
}
排序效果
sortedArrayUsingSelector:这个方法的参数是一个方法,我们可以自定义自己的排序规则

修改User类,在User.h中增加声明一个方法,代码如下:

/** 姓名 */
@property (nonatomic, copy) NSString *name;

/** 年龄 */
@property (nonatomic, assign) NSInteger age;

- (instancetype) initWithName:(NSString *)name Age:(NSInteger)age;

// 增加声明的方法,用于自定义排序方法
- (NSComparisonResult)compareByAge:(User *)otherUser;

在User.m中实现该方法:

- (instancetype) initWithName:(NSString *)name Age:(NSInteger)age
{
    self = [super init];
    if (self) {
        self.name = name;
        self.age  = age;
    }
    return self;
}

- (NSComparisonResult)compareByAge:(User *)otherUser
{
    // _age 为 User的属性
    if (_age > [otherUser age]) {
    
        return NSOrderedAscending;
    } else if(_age == [otherUser age]) {
    
        return NSOrderedSame;
    } else{
    
        return NSOrderedDescending;
    }
}

在ViewController中的实现也修改一下:

// 创建5个user对象
User *user1 = [[User alloc] initWithName:@"MM" Age:8];
User *user2 = [[User alloc] initWithName:@"MM" Age:3];
User *user3 = [[User alloc] initWithName:@"AA" Age:2];
User *user4 = [[User alloc] initWithName:@"SS" Age:7];
User *user5 = [[User alloc] initWithName:@"GG" Age:5];

// 将创建好的对象放入数组中,等待排序
NSArray *userArr = @[user1, user2, user3, user4, user5];

// 不需要创建排序条件,而是直接调用User类中写好的排序方法
NSArray *newUserArr = [userArr sortedArrayUsingSelector:@selector(compareByAge:)];

for (User *user in newUserArr) {
    
    NSLog(@"姓名:%@ -- 年龄:%ld", user.name, user.age);
    
}

看一下执行结果吧!

自定义排序方法结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,766评论 18 399
  • 有时候,听到别人的消息就会慌了神。他们的经历制造了一个幻象——好像生活有无限种可能。世界是五彩缤纷的、花样百出的、...
    seasea阅读 482评论 2 3
  • ios 交流群:264706196 问题描述 默认情况下,UitextView显示如下: 文字不是从开头显示的,我...
    面试小集阅读 3,187评论 4 1