首页 iOS 数组常用操作: 排序
文章
取消

iOS 数组常用操作: 排序

简单数组排序

数字, 字符串 数组的排序相对来说非常简单. 直接使用 API 对如下数组排序:

1
NSArray *nums = @[@7, @2, @8, @3, @9, @6, @5];

升序排序:

1
2
3
4
[nums sortUsingComparator:^NSComparisonResult(NSNumber *obj1, NSNumber *obj2) {
    // 默认升序排序, 降序排序只需颠倒 compare: 方法返回的 NSComparisonResult 枚举即可
    return [obj1 compare:obj2];
}];

输出结果:

1
(2, 3, 5, 6, 7, 8, 9)

复杂对象数组的排序

以对 Person 实例对象数组排序为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Person 类头文件
@interface Person : NSObject

@property (nonatomic, copy)   NSString *name;   // 姓名
@property (nonatomic, assign) NSInteger age;    // 年龄
@property (nonatomic, assign) CGFloat   height; // 身高
@property (nonatomic, assign) CGFloat   weight; // 体重

@end

// 实现部分
@implementation Person

// 重写 description 方法方便查看输出内从
- (NSString *)description {
    return [NSString stringWithFormat:@"%@: %ld岁  %.0fcm  %.0fkg", _name, _age, _height, _weight];;

}

@end

现在要对以下数组进行排序:

1
2
3
4
5
6
7
NSArray *persons = 
@[[Person persionWithName:@"张三" age:16 height:178 weight:69],
  [Person persionWithName:@"李四" age:28 height:173 weight:66],
  [Person persionWithName:@"王五" age:21 height:185 weight:73],
  [Person persionWithName:@"赵六" age:21 height:159 weight:51],
  [Person persionWithName:@"孙七" age:18 height:165 weight:56],
];

目标:

  1. 根据年龄升序进行数组排序.
  2. 根据年龄降序, 同龄的再根据身高降序排序.

一般做法:

1. 根据年龄升序进行数组排序.

1
2
3
4
[persons sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
    // 此处使用 '>' 和 '<' 决定了升序还是降序  
    return obj1.age > obj2.age;
}];

输出结果:

1
2
3
4
5
6
7
(
    "张三: 16岁  178cm  69kg",
    "赵六: 18岁  165cm  56kg",
    "王五: 21岁  159cm  51kg",
    "孙七: 21岁  185cm  73kg",
    "李四: 28岁  173cm  66kg"
)

2. 根据年龄降序, 同龄的再根据身高降序排序.

1
2
3
4
5
6
7
[persons sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
    // 如果年龄相同, 直接对比 '身高' 即可
    if (obj1.age == obj2.age) {
        return obj1.height < obj2.height;
    }
    return obj1.age > obj2.age;
}];

排序结果:

1
2
3
4
5
6
7
(
    "张三: 16岁  178cm  69kg",
    "赵六: 18岁  165cm  56kg",
    "孙七: 21岁  185cm  73kg",
    "王五: 21岁  159cm  51kg",
    "李四: 28岁  173cm  66kg"
)

使用 NSSortDescriptor 进行排序

NSSortDescriptor 是苹果提供的一个排序规则描述类. 我们可以通过他对数组内对象的某一个属性定义排序规则. NSArraysortedArrayUsingDescriptors: 方法传入的是一个 数组, 说明此处可以直接对数添加多个排序规则.

1. 根据年龄升序进行数组排序.

1
省略, 直接看排序 2.

2. 根据年龄降序, 同龄的再根据身高降序排序.

1
2
3
4
5
6
// 定义 age 属性排序规则
NSSortDescriptor *ageDesc = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
// 定义 height 属性排序规则
NSSortDescriptor *hegDesc = [[NSSortDescriptor alloc] initWithKey:@"height" ascending:NO];
// 通过排序规则对属性进行排序, NSSortDescriptor 对象在数组的顺序就是排序的优先级顺序
[persons sortedArrayUsingDescriptors:@[ageDesc, hegDesc]];

排序结果:

1
2
3
4
5
6
7
(
    "张三: 16岁  178cm  69kg",
    "赵六: 18岁  165cm  56kg",
    "孙七: 21岁  185cm  73kg",
    "王五: 21岁  159cm  51kg",
    "李四: 28岁  173cm  66kg"
)
本文由作者按照 CC BY 4.0 进行授权